字符串
一、定义
一个或多个字符的序列。
字符串实际上是使用空字符 ‘\0’ 结尾的一维字符数组。因此 ’\0’ 是用于标记字符串的结束。
“I am a simple!”
- 使用 NULL字符
'\0'
终止的一维字符数组。 - 双引号将字符串括起来,告知编译器它是字符串.
二、储存字符串
字符串被储存在char类型的数组中(由连续的储存单元组成)
字符串中字符储存在相邻储存单元,每个单元存储一个字符。
注意:
- 空格也是字符。
- ‘\0’是空字符,表示字符串的结束,属于非打印字符。(空字符不用亲自打印,程序自动添加)
- 数组容量 = 待存储字符串字符数+1(char name[5] = “Smith”; 错误)
- ‘a’ 表示是一个字符,“a” 表示一个字符串相当于 ‘a’+‘\0’;
''
里面只能放一个字符;
""
里面表示是字符串系统自动会在串末尾补一个‘\0’
。
三、使用字符串
%s 转换说明 打印字符串
-
初始化
char s[6] = {‘K’,‘i’,‘t’,‘t’,‘y’,’\0’};
char s[6] = {“Kitty”};
char s[ ] = {“Kitty”};
char *s = “Kitty”;
注意
如果没有在字符数组最后增加\0
的话输出结果有误#include <stdio.h> #include <string.h> int main( void ) { // 初始化字符串 char greeting[5] = { 'H', 'e', 'l', 'l', 'o' }; printf("Greeting message: %s\n", greeting); }
在使用不定长数组初始化字符串时默认结尾为\0
#include <stdio.h> #include <string.h> int main( void ) { // 初始化字符串 char greeting[] = "Hello"; printf("Greeting message: %s, greeting[] Length: %d\n", greeting, sizeof(greeting)); }
-
输出
for 遍历:
for(i=0, i<6, i++) { printf("%c",s[i]); }
直接输出:
printf(s);
字符串格式(%s)输出:
printf("%s",hi);
四、操作字符串的函数
-
strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
#include <stdio.h> #include <string.h> int main( void ) { char str1[6] = "Hello"; char str3[6]; strcpy(str3, str1); printf("%s\n", str3 ); }
-
strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
#include <stdio.h> #include <string.h> int main( void ) { char str1[6] = "Hello"; char str2[] = " Kitty"; strcat( str1, str2); printf("%s\n", str1 ); }
-
strcmp(s1, s2);
若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
#include <stdio.h> #include <string.h> int main( void ) { char str1[6] = "Hello"; char str2[6] = "Kitty"; int num = strcmp( str1, str2); //逐个比较,H<K,输出-1 printf("%d\n",num); char str3[6] = "Hello"; char str4[8] = "Hellcat"; num = strcmp( str3, str4); //逐个比较,直到比到不相同的地方o>k,输出1 printf("%d",num); }
-
strchr(s1, char);
返回一个指针,指向字符串 s1 中指定字符的第一次出现的位置。(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果在字符串
s
中未找到c
字符,该函数则返回空指针。#include <stdio.h> #include <string.h> int main( void ) { char str1[] = "beautiful"; char *ptr = strchr(str1,'u'); printf("%s",ptr); }
-
strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
#include <stdio.h> #include <string.h> int main( void ) { char str1[] = "remember"; char *ptr = strstr(str1,"em"); printf("%s",ptr); }
-
strlen(s1);
返回字符串 s1 的长度。
#include <stdio.h> #include <string.h> int main( void ) { char str1[] = "remember"; printf("%d",strlen(str1)); }
注意
strlen 与 sizeof 的区别strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 unsigned int 类型。
sizeof 计算的是变量的大小,需要加上字符
\0
;而 strlen 计算的是字符串的长度,不需要加上
\0
。#include <stdio.h> #include <string.h> int main( void ) { char str1[] = "remember"; printf("%d\n",strlen(str1)); printf("%d",sizeof(str1)); }
五、其他
-
输入超过字符数组大小的字符串
定义了数组,编译器为这个数组在栈里开辟了3个字节的内存空间,但是这3个空间之后的一些空间是没有被占用的,你就成功得输入了超过了3个数到这个数组中,并且能正常输出,但是如果之后的空间被占用了,就会导致严重的问题,会提示该内存不可写。
输入和输出函数只管把数组’\0’结尾前的字符序列以字符串形式输出,C/C++是不检查数组越界的。防止数组越界的任务完全由程序员事先安排完成;如果越界的空间被占用,后果则有程序员自己承担。
-
字符数组名与整型数组名
解释:对于一维字符数组名的输出,编译器会默认你想输出的是数组里的内容,而对于其他类型数组名的输出,如整形数组,编译器默认的输出是数组首元素的地址。