淘先锋技术网

首页 1 2 3 4 5 6 7

字符串

  • 以整数 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()