学完上一页的字符数组的定义,我们接下来开始学习一些字符数组可能要使用到的一些函数,
因为是字符数组,它们的函数大多都是和字符串有关,所以我们开始时要引入“string.h”这个“字符串处理”的头文件,这个头文件里包含我们经常使用的“strlen、strcmp、strcpy”“计算长度,比较大小,拷贝”
那么我们先来使用“strlen”用来计算字符串的长度的函数吧,
代码如下: 我们要记得调用“string.h”库
strlen(数组地址也就是数组名);返回的是一个整数类型的数值
#include<stdio.h> #include<string.h> int main() { char a[10]={"love"}; printf("%d",strlen(a)); return 0; }
代码调试截图如下:
我们来学习一下“strcmp()”比较字符串大小的函数,这个函数可有意思了,让我们比较字符串的大小,我们仔细一想,字符串怎么比大小?比的是长度?感觉很神奇,
首先我们先大概抽象的理解一下,
“strcmp(s1,s2);”意思是,
若 s1=s2 则 返回值为“0”,
若 s1>s2 则 返回值为“正数”,
若 s1<s2 则 返回值为“负数”,
我们先按照这个定义来写一下代码,
代码如下:我们先不需要理解计算机是如何比较字符串的大小,一会儿我们就会将到
#include<stdio.h> #include<string.h> int main() { char a[10]={"love"}; char b[10]={"like"}; printf("字符串相等时,返回值为:%d\n",strcmp(a,a)); printf("字符串a>b时,返回值为:%d\n",strcmp(a,b)); printf("字符串a<b时,返回值为:%d\n",strcmp(b,a)); return 0; }
代码调试截图如下:通过输出内容,我们发现了输出了“1”和“-1”我们不能说 如果不等于时一定输出“1”或“-1”因为C语言并没有明确规定,只规定了“正数”和“负数”
我们先说明一下,在C语言中两个字符串是如何连接起来(不同语言的连接字符串方式大有不同,例如:e4a,用&连接;E语言,用+连接),我们需要调用“string.h”库中的“strcat(a,b);”
用代码来解释一下:原来数组a[10]我想看看是不是数组b的内容直接赋值给数组a的空的内存地址中,我把a[10]修改为a[5]顺便验证一下我们的猜想
#include<stdio.h> #include<string.h> int main() { char a[5]={"love"}; char b[10]={"like"}; strcat(a,b); printf("%s",a); return 0; }
代码调试截图如下:我们发现并不是将数组b的数值添加到a中未赋值的空间,我们的猜想失败,
那么难道是将数组b的内存地址更改了?继承了数组a后面的地址?我们再次带着疑问写下代码,我们观察一下他们的内存地址有何规律
输出地址的代码如下:
#include<stdio.h> #include<string.h> int main() { char a[5]={"love"}; char b[10]={"like"}; strcat(a,b); printf("%s\n",a); for(int i=0;i<20;i++) printf("%c %d\n",a[i],&a[i]); return 0; }
代码调试截图如下:我们发现我们的猜想成立,成功了,发现它竟然真的是改变了地址,
那么我们只是输出了数组a的地址,我们再来看一看数组b的地址会不会被泯灭了?
带随着疑问,我们来写下代码输出数组b的地址以及其对应的数值
代码如下:
#include<stdio.h> #include<string.h> int main() { char a[5]={"love"}; char b[10]={"like"}; strcat(a,b); printf("%s\n",a); for(int i=0;i<20;i++) printf("%c %d\n",a[i],&a[i]); printf("\n\n"); for(int i=0;i<15;i++) printf("%c %d\n",b[i],&b[i]); return 0; }
代码调试截图如下:我们发现数组b的值以及其对应的地址完好无损,那么我们就得出结论了,能得到“strcat”连接语句自动在“数组a”后面申请了适当的内存地址,这是重点大家要记住。
好的,接下来我们来解释一下,字符串的大小是如何比较的,
例如:love>like 原理是,计算机先比较 第一个字符,l=l 发现他们的第一个字符对应的ASCII码值是相等的,那么就会比较他们的第二个字符 o>i ,o的ASCII值为111 i的ASCII值为105,
111>105,所以 后面也不需要比较了,直接说明 因为 o(ASCII)>i(ASCII) 所以直接判定,love>like
那么我来出一道题,用字符串比较大小,比较 10 和 2 谁大,那么我们开始,10的第一个字符为 1,2 的第一个字符 为 2,2>1,则 2>10,那么我们知道 2应该小于10的,那么我们应该怎么办呢?其实不难,只要在2前面加上一个0,比较 10 和 02 的大小,就可以实现,10>2了
OK,丰富了我们的大脑,我们来学习一个简单的字符串命令“strcpy()”百度百科:strcpy是一种C语言的标准库函数,strcpy把含有‘\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。
例如代码:将数值b的字符串拷贝到数组a中
#include<stdio.h> #include<string.h> int main() { char a[5]={"love"}; char b[10]={"like"}; printf("%s\n%s\n",strcpy(a,b),a); return 0; }
代码调试截图:我们发现了,原来数组a的字符串被覆盖了,
评论抢沙发