字符数组和字符串

字符数组:数组元素均为字符型数据的数组。
字符串:由数字、字母、下划线组成的一串字符。(一对双引号括起来的字符序列【有结束标记】)e.g:“hello”
注:在c语言中没有字符串变量,必须用字符型数组保存字符串,每个元素放一个字符。(c++中有:C++:string s="hello"可以用来定义字符串变量)所以字符数组通常做存储字符串的容器。

字符串在内存中的存储结构

在字符存储入字符数组中时,字符串末尾都有结束标记\0
注:将一个字符一个字符加入是要手动添加结束标记,当加入为一串字符串时则不需要手动加结束字符
此处对转义字符进行补充归纳:
以\开头的叫转义字符:如:’\0’表示结束标记,’"‘表示输出双引号,’’‘表示输出单引号,’\‘表示输出反斜杠
并且有:a[10]=0和a[10]=’\0’都表示结束标记

对字符串的辨析:
1.char s[100]=”hello”;字符串长度:5 数组长度:100
//char s[100]={“hello”};——这是错误的
2.char s[]=”hello”;字符串长度:5 数组长度:6(自动是6)
3.char s[6]={‘h’,’e’,’l’,’l’,’o’};字符串长度:5 数组长度:6 (也是字符串)
4.char s[5]={‘h’,’e’,’l’,’l’,’o’};见下面注释:
只有末尾有结束标记的字符序列才是字符串
字符串必须存在字符数组中,字符数组中存放的不一定是字符串 如:第四个

相关语法

故由上面总结:
初始化:char s[100]=“hello”
输入字符串:gets(s);//字符串输入的专用函数scanf(“%s”,s);//格式化输入
输出字符串:puts(s);//字符串输出的专用函数printf(“%s”,s);//格式化输出
在scanf里数组名s表示该数组的起始地址,因此不需要再加&符号
并且scanf无法输入空白符
如:
Input:Hello world
Output:Hello

补充:空白符:空格、制表符、换行符等统称为空白符(space character),它们只用来占位,并没有实际的内容,也显示不出具体的字符。
空白符的含义模糊,通常是指空格’ ‘,其ASCII码为32。
制表符为’\t’,相当于4个或8个空格符,其ASCII码为9。
换行符为’\n’,作用是将光标移至下一行,其ASCII码为10。
回车’\r’,作用是让光标移至行首,其ASCII码为13。
除了水平制表符’\t’,还有垂直制表符’\v’,这个转义字符只有在打印机中才能显示出来,显示屏不起作用的,其ACSII码为11。
**puts(s);自带换行效果======printf(“%s\n”,s);

关于字符串输入输出的修正

如下程序:(右边程序是错误的)

               scanf(“%d”,&n);           scanf(“%d”,&n);
               scanf(“%s”,s);            gets(s);
               printf(“%s”,s);           printf(“%s”,s);
               puts(s);                  puts(s);
input:10
      Hello
output :      10                        10
               Hello10                   10
               Hello
  

由于回车符的影响导致gets(s);不能输入
错误修正:

//方法一:
scanf(“%d”,&n);
getchar ();————————吃掉回车符
gets(s);
printf(“%s”,s);
puts(s);
//方法二:
scanf(“%d%*c”,&n);—————————scanf(“%*c”);跳过一个字符(char)
gets(s);
printf(“%s”,s);
puts(s);
//方法三:
scanf(“%d”,&n);
fflush (stdin);————————清空缓冲区(函数)
gets(s);
printf(“%s”,s);
puts(s);

字符串常用函数

字符串连接:
strcat(s1,s2)将s1接到s2后面
前面字符串要加长:s1[101],s2[101]变成s1[201],s2[201]

字符串比较:
strcmp(s1,s2)
将字符串s1和自左至右逐个字符相比,直到出现不同的字符或遇到结束标记”\0“为止
函数结果:
如果字符串s1和s2相同,则为0
如果字符串s1大于s2,则为(1)
如果字符串s1小于s2,则为(-1)
***和0比较即可,不用判断数值

字符串拷贝:
strcpy(s1,s2)
将s2的内容烤到s1内(注意s1数组的空间)
特别区别:(区别于数值型和字符串型)
数值型:int a,b=2;a=b;
字符串型:(拷贝)
char s1[100],s2[100]=”hello”;
strcpy(s1,s2);//内容拷贝

char s1[100],s2[100]=”hello”;
s1=s2;//语法错误 //原因分析:s1和s2都是数组名,数组名表示起始地址,且为地址常量(类比于:数学中的集合——集合中的元素相等“=”,而集合和集合之间没有“=”关系)

小结

字符串操作特点:
字符串输入和输出:
1、字符串通常都是整体的进行输入和输出。
2、整体输入后,字符串末尾会自动加上结束标记
//通过循环依次操作字符,可以实现字符串的输入和输出(太麻烦,不采用)

补充:如何对字符串进行遍历?
方法一:直到访问到结束标记为止。
方法二:strlen(s)可以得到字符串的长度(函数)
例程:字符串的加密
思路:
1、确定数组长度 数组长度至少要比字符串长度大1
2、字符串如何遍历?

常见问题:
1、数组开多大:数组型数组:到上限即可 字符型数组:N+1
2、输入和输出:数值型:一个个输入输出 字符型:整体
数组遍历:数值型:需用变量记录元素个数 字符串:方法一:直到访问到结束标记为止。方法二:strlen(s)可以得到字符串的长度(函数)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐