字符串
字符串常量
字符串常量是由一对双引号括起来的一个字符序列。如“hello”,“12354”“
无论双引号内是否包含字符,包含多少个字符,都代表一个字符串常量
为便于确定字符串的长度,C编译器会自动在字符串的末尾添加一个ASCLL码值为0的空操作符‘\0’作为字符串结束的标志,在字符串中可以不显示地写出
字符串:实际就是由若干有效字符构成且以字符‘\0’作为结束的一个字符序列
字符串的储存
- C语言中没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现
- 判断存入字符型数组的是否是一个字符串需要通过观察其结尾是否有‘\0’来判断
- 字符串结束标志‘\0’也占一个字节的内存,但他不计入字符串的实际长度,只计入数组的长度
字符串赋值时可以直接声明数组长度,也可以不声明数组长度
- 当声明了数组长度时,不需要需要使输入的数组最后一位是‘\0’,系统会自动补’\0’
- 没有声明数组长度,必须人为地在数组初始化列表中添加’\0’
char str[6] = {'H','e','l','l','o','\0'};
char str2[6] = {'H','e','l','l','o'};
char str3[] = {'H','e','l','l','o','\0'}
以上的三种赋值法都是合法的
字符串的长度
字符串的长度和字符串数组的长度不同
数组长度 = 字符数 + 1
二维字符数组
通常,我们将一个字符串放在一维字符数组中;将多个字符串放在多维字符数组中
字符第一维的长度代表字符串的个数,可以省略;但是第二维的长度不能省略,应该按最长的字符串的长度设定第二维的长度
char weekday[7][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char weekday[][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
上述的两种初始化的方法是正确的
若字符串太长,无法写在一行中,则可将其拆分成几个小的片段写在不同的行中
char longString[] = "This is the first half of the string"
"and this is the second half.";
字符指针
字符指针:是指向字符型数据的指针变量。
字符指针中存储的地址值是字符数组的首地址
字符指针的定义
直接定义 char *ptr =“Hello”
间接定义 char *ptr; ptr = “Hello”
字符串的访问和输入/输出
如何访问字符串中的单个字符
和其他类型的数组一样,可以通过使用下标的方式访问存储在字符中的每个字符
str [0] 就是字符数组的第一个字符
此外可以通过字符指针间接访问存放于数组中的字符串
若字符指针ptr指向了数组str的首地址,既可以通过*(ptr+i)来引用字符串中的第i+1个数组;
*(ptr+i)相当于 *(str+i)即str[i]
注意,对于数组名str,不能使用str++操作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能被改变的
字符串的输入\输出
有三种方式可以对字符串进行输入或输出
第一种按照C格式符
for(i = 0; i < 10; i++)
{
scanf("%c",&str[i]); //输入
}
for(i = 0; i < 10; i++)
{
printf("%c",&str[i]); //输出
}
第二种按照S格式符
scanf("%s",str);
printf("%s",str);
注意当使用S格式符时,无论是输入还是输出,都不用&取地址符
因为此时str不仅仅是字符名,也是代表字符的首地址
第三种gets()puts()
使用字符串处理函数gets(),可以输入代空格的字符串
gets()以回车符作为字符串的终止符,同时将回车符从缓冲区读走,但不作为字符串的一部分
scanf()不读走回车符,回车符仍在输入缓冲区
puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个’\0‘时输出结束,并自动输出一个换行符
printf()可以在输出行中添加一些其他的字符信息
由于gets()函数不能限制输入字符串的长度,需要用fgets()函数来约束它
fgets(name,sizeof(name),stdin)
字符串处理函数
函数功能 函数调用的一般形式 功能描述及其说明 求字符串长度 strlen(str) 由函数值返回字符串str实际长度,即不包括’\0’在内的实际字符的个数 字符串复制 strcpy(str1,str2) 将字符串str2复制到字符数组str1中,这里应确保字符数组str1的大小足以存放下字符串2 字符串比较 strcmp(str1,str2) 比较字符串str1和str2的大小,结果分一下三种第一种当str1大于str2时,函数返回值大于0;当str1等于str2时,函数返回值等于0;当str1小于str2时,函数返回值小于0 字符串链接 strcat(str1,str2) 将str2添加到str1的末尾 “n族”字符串复制 strncpy(str1,str2,n) 将字符串str2的至多前n个字符复制到字符数组str1中 “n族”字符串比较 strncmp(str1,str2,n) 比较前n个字符 “n族”字符串链接 strncat(str1,str2,n) 将str2最多前n个字符添加到str1的末尾