字符串
-
以整数 0 结尾的一串字符,0或者’\0’表示字符串的结束,不是’0’,这个是一个ASCII码的形式。但它不是字符串的一部分,计算字符串长度的时候也不包括0
-
string.h 定义了许多字符串处理的函数
-
字符串以数组的形式存在,以数组或者是指针的形式访问,可以用遍历的方式访问字符串
char word[] = {'H','e'}; //不是字符串
char word[] = {'h','\0'}; //字符串
char word[] = {'h',0}; //等价于上
- 字符串常量定义
char *str = "Hello";
char word[] = "Hello"; //都是定义字符串的正确方法,字符串的所占的内存是6个,即占6个空间的数组
printf("aaa""AAA"); //两个字符串中间没有任何连接符的时候,编译器会自动将字符串连接起来
在上述程序中,str是一个指针,他的值是存放字符串的首地址,字符串会被存放在代码段,是只读不写的,所以如果str[0] = ‘g’; 想要修改字符串里的值,程序会崩溃。
如果用上述程序的数组方法定义,相当于是一个本地变量,就会放在本地变量的内存中,可以修改
- 字符串的输入输出
scanf("%s",string); //读入一个单词,到空格、tab、回车为止
char word[8];
char word2[8];
scanf("%7s",word); //在键盘中输入as ss时 as会被赋值给word,空格符标志这个单词结束,scanf只读一个单词,下个单词ss会被赋值给下一个scanf %7s要指定字符串的长度,超过7的字符串后面的字符会被舍弃,如果有第二个scanf,会给第二个scanf.如果不加的话溢出会导致错误
scanf("%7s",word2);
printf("%S",string);
- 指针需要指向确定的地址
char *string; //定义了一个指针却没有指向确定的地址
scanf("%s",string); //此时输入的字符串会被赋值给string此时指向的地址,如果他此时指向一个原本有数的地址,那么程序就会出现错误。
- 定义空字符串
char buffer[100] = "";
char buffer[] = ""; //系统自动定义数组的长度是1,即buffer[0]='\0',这个字符串放不下其他任何数了
- 字符串的处理函数
包含在头文件string.h中
//数组的长度
char line[] = "Hello";
printf("%lu\n",strlen(line)); //输出5,字符的个数
printf("%lu\n",sizeof(line)); //6,包括了/0,内存的个数
//比较字符串的大小
int strcmp(const char *s1,const char *s2);
//const 表示传入的参数不会被修改,char *s1,是指向字符串的指针。
//返回: 0 字符串相等 1 s1>s2(s1的ASCII码值之和大于s2) -1 s1 < s2
//如果直接 s1 == s2 这个值永远是false 因为即使两个字符串的值相同,他的地址也不相同
//拷贝字符串
char* strcpy(char *restrict dst,const char *restrict src);
//将src中的字符串拷贝到dst中,restrict表示两个字符串不重叠,返回dst
//添加字符串
char* strcat(char *restrict s1,const char *restrict s2);
//将s2拷贝到s1的后面,接成一个长的字符串,返回s1
//strcpy和strcat都是不安全的函数,可能会超出空间限制,推荐使用:
char* strncpy(char *restrict dst,const char *restrict src,size_t,n); //规定了空间最大,size_t是c标准库中定义的,小于等于这个大小,就可以被安全的存放不溢出
char* strncat(char *restrict s1,const char *restrict s2,size_t,n);
//在字符串中查找字符
strchr() strrchr()