引言:字符型数据(char)在内存中以相应的ASCII码存在。计算机中用一个字节(8个二进制)存储一个字符。
字符组成字符串,字符可以包括字母、数字、其他字符、转义字符、汉字(一个汉字占两个字符)。
1.接下来,区分三个常量:字符常量、字符串常量与转义字符。
字符常量:用一对单引号括起的一个字符;
转义字符:
\n表示换行; \t表示横向跳格;
\b表示退格(输出位置移动到前一列); \r表示回车;
\\表示反斜杠字符”\”; \'表示单引号字符;
\"表示双引号字符; \ddd表示八进制数ddd所代表的字符;
\xhh表示十六进制hh所代表的字符。
注意:转义字符占一个字节;
字符串常量:用双引号括起来的字符;
字符串的存储:
每个字符串常量有一个字符串结束标志‘\0’在末尾,其中结束标志不记录在字符串的长度计算。
字符串初始化数组:
#include<stdio.h>
int main()
{
char c[5];//定义数组
char a[]="abc";//定义并且初始化数组
char d[]={'c','b','\0'}; //定义并且初始化数组
char f[3]={"ch"};//定义并且初始化数组
return 0;
}
这几个形式可以作为格式;
编程提醒:
1.数组的长度必须比字符串的元素(不包括结束标注)个数多1个,用以存放字符串结束标志。
2.数组名是地址常量,不能将字符串直接赋值给数组名——c=“cd”;是错误的。
3.字符串到第一个'\0'结束。
#include<stdio.h>
int main()
{
char x[5]="ab\0c";
printf("%s",x);
return 0;
}
2.字符串的输入输出(常见的)
2.1 scanf的输入(printf(输出))用格式符“%s”输入字符串,对应的参数应该是数组名,即数组的起始地址或数组元素地址。
#include<stdio.h>
int main()
{
char c[6];
scanf("%s",c);//这里的c是数组第一个元素的地址,所以不用加取地址符
printf("%s",c);
return 0;
}
代码的运行:
2.1.2指定宽度输出。
%ms可以按指定宽度输出字符串。
m的情况讲解:
1.当m小于实际宽度时不起作用;
2.当m大于实际宽度时左边补零(右对齐);m前加负号右边补空格。
%.ns表示指定只输出字符串的前s(正整数)个字符
#include<stdio.h>
int main()
{
char c[6];
scanf("%s",c);//这里的c是数组第一个元素的地址,所以不用加取地址符
printf("%.2s\n",c);
printf("%5s\n",c);
printf("%-5s",c);
return 0;
}
运行结果:
2.1.3 用scanf与printf的注意事项:
1.scanf遇到空格、tab、回车符终止,并写入串结束标志'\0';
2.要想在字符串中包含空格、tab、无法用scanf中"%s"输入,可以用gets函数输入;
3.printf一个个输出字符直到遇到'\0'结束,不会自动换行,但是puts输出可以自动换行;
2.2 gets输入与puts输出
2.2.1 使用方式
gets(str);//读入一串以回车结束的字符,顺序存入到以str为首地址的内存单元,最后写入字符串结束标志'\0'。
puts(str);//一个个输出字符直到遇到'\0'结束,最后输出一个换行符。
参数str为字符数组名或其某个元素地址;
#include<stdio.h>
int main()
{
char c[6],a[5]="56";
printf("输入:");
gets(c);
printf("输出:") ;
puts(c);
printf("输出:") ;
puts(a);
return 0;
}
运行结果: