字符串是位于双引号中的字符序列
在内存中以"\0"结束,所占字节比实际多一个
注意:
(1)可以把一个字符常量赋给一个字符变量,但不能把字符串常量赋给字符变量
(2)C语言中没有字符串变量,可以用字符数组来存放字符串
1、字符数组的概念
用来存放字符的数组称为字符数组。
2、字符数组定义
形式和前边介绍的数值数组相同
char 数组名[常量表达式]
例如:char ch[5];
字符数组也可以是二维或多维数组。
char 数组名[常量表达式1][常量表达式2];
例如:char ch[2][5]; 即为二维字符数组。
注意:定义字符数组时,应确保数组长度比字符串长度至少多1
3、字符数组初始化
字符数组也允许在定义时作初始化赋值
char ch[4] = {'a', ' ', 'o'}; 赋值后各元素的值为:
ch[0] = 'a';
ch[1] = ' ';
ch[1] = 'o';
其中ch[3]未赋值,系统自动赋值为0。
当对全体元素赋初值的时候也可以省去长度说明。例如:
char ch[] = {'f', 'A', ' '};
这时数组长度自动定为3。
注意:未被使用的元素均被自动初始化为0
4、字符数组的引用
字符数组和普通数组一样,也是通过下标引用。
5、字符串和字符串结束标志
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) 4 { 5 //这种初始化方式后面必须加上'\0',否则会出现乱码或我们不想要的内容 6 char ch[] = {'i', 't', 'c', 'a', 's', 't', '\0'}; 7 printf("%s\n", ch); 8 int len = sizeof(ch)/sizeof(char); 9 printf("数组长度为%d\n", len); 10 return 0; 11 }
C语言允许用字符串的方式对数组作初始化赋值。例如: char c[]={'c', ' ','p','r','o','g','r','a','m', '\0'};
可写为: char c[] = {"c program"}; 或去掉{}写为: char c[] = "c program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面 的数组c在内存中的实际存放情况为:
'\0'是由C编译系统自动加上的。由于采用了'\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
7、字符数组的输入输出
(1)字符串的输出
在采用字符串方式后,字符数组的输入输出将变得简单方便。
除了上述用字符串赋初值的办法 外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。
注意在本例的printf函数中,使用的格式字符串为"%s",表示输出的是一个字符串。而在输出表列中给出数组名则可。
不能写为:printf("%s",c[]);
思考&实现1:
使用 scanf() 从控制台输入一个字符串,然后使用 printf() 将其输出。
数组长度为100,因此输入的字符串长度必须小于100,以留出一个字节用于存放字符串结束标志 '\0'。
值得注意的是,对于字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf、函数输入字符串时,字符串中不能有空格,否则将以空格作为字符串的结束符。
从输出结果可以看出空格以后的字符都未能输出。为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:
1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) 4 { 5 char str1[10], str2[10], str3[10], str4[10]; 6 printf("请输入字符串:\n"); 7 scanf("%s%s%s%s", str1, str2, str3, str4); 8 printf("你输入的字符串为:%s%s%s%s\n", str1, str2, str3, str4); 9 return 0; 10 }
这是由于在C语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块 连续的内存单元。
设数组c的首地址为0xffc0,也就是说ch[0]单元地址为oxffc0。则数组名c就代表这个首地址。
因此在ch前面不能再加地址运算符&。如写作scanf("%s",&ch);则是错误的。
在执行函数printf("% s",ch) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。
8、计算字符串长度
(1)使用字符串处理函数 strlen
注意:使用 strlen 计算字符串长度时,不包含'\0'
(2) 使用自定义方法,以'\0'作为字符串结束条件,进行遍历统计
9、字符数组和普通数组的区别
实际上,字符数组和普通数组没什么本质区别。
注意的是:数组类型的含义:数组类型指的是数组所包含的元素的的类型,而不是数组名的类型,数组名是一个指针,指向数组第一个元素的地址,即数组的首地址。
字符数组的每个元素都是char类型,整型数组的每个元素都是int类型。
scanf() 和 printf() 函数有一种格式化字符串 %s 可以用来整体输入输出字符数组,但是没 有特定的格式支持 int 数组整体数组输出。
来源:https://www.cnblogs.com/xdl745464047/p/4003882.html