停课不停学
我们在努力(来与我们一起努力吧 公众号:同年新月)
C/C++ 字符串知识汇总
01
字符串是以空字符'0'结尾的char类型数组
表示字符串
① 字符串字面量(字符串常量)
用双引号括起来的内容称为字符串常量。字符串的生存期是整个程序。
注意:如果要在字符串内部使用双引号,必须在双引号前面加上一个反斜杠(")
字符串常量属于静态存储类别,这说明被使用的字符串只会在存储器中存储一次。而对于用双引号括起来的内容视其类型是char*,即指向字符串的指针。
printf("%s","TNXY2020");//输出TNXY2020
或者
#define A "TNXY2020" //可以用A代替“TNXY2020”
②字符串数组和其初始化
定义字符串数组时一定要保证有充足的空间存储,(不要忘记'0')。
char str[10]="TNXY2020";//这时未被初始化的字符数据自动初始化为'0'
或者不声明大小,让编译器计算
char str[]="TNXY2020";//大小为9
注:必须有赋值并且是定义时才可以省略大小。
注意:声明数组时,数组大小必须是可求值的整数。
指针表示法创建字符串:char* ptr="TNXY2020";
③数组和指针
数组形式:char arr[]="TNXY2020";
编译器会为左边的数据分配9个字符大小的空间,而右边的数据存储在静态内存中,两份拷贝。数组名是字符串的首地址的别名,常量(比如arr++;是错误的)。而数组的内容可以改变。
指针形式:char ptr="TNXY2020";
编译器会为左边数据分配一个指针的空间,右边分配9个字符大小的空间,并让指针指向右边的字符串,是变量。但是右侧的数据是常量,所以指针指向的内容不可以改变。
02
字符串输入
1.分配空间
-假设这样:
char *name;
scanf("%s",name);
因为scanf()要把信息拷贝至参数指定的地址上,而此时该参数是一个未初始化的指针,指针可能指向任何地方,而没有空间,程序会异常终止。(大多数程序猿会认为出现这种情况很搞笑,但仅限于评价别人的程序时...)
最简单的方法是,在声明的时候显式声明为确定大小的数组。 或者用malloc()等函数分配空间。
2.不幸的scanf()和gets()函数
scanf("%s" , )只能读取一个单词。从第一个非空白字符开始读取,直到下一个空白字符(空行、空格、制表符或换行符)结束。如果指定了字段宽度,如%10s,scanf()将读取10个字符或读到第一个空白字符停止,同时指定宽度可以起到防止溢出的效果。
gets(字符串地址)读取整行输入,直至遇到换行符,然后丢弃换行符,存储其他字符,并在这些字符的末尾添加一个空字符。缺陷:不能知道输入行的大小,可能会出现缓冲区溢出。
gets()的替代品以及输出的实现后天再总结吧,明天一大早有英语课直播(苦逼....)