C语言中字符、字符数组、字符串
C语言中字符、字符数组、字符串#
字符
char op;
scanf("%c",op);
printf("%c",op);
字符通过格式控制符%c
来控制初始化,字符只能用单引号''
来表示
char op;
op = 'a';
printf("%c",op);
定义一个字符变量只能初始化一个字符,而这种情况无法满足大多数情况的需要,当遇到多个字符的输入输出问题时就需要用到字符数组(字符串)。
字符数组/字符串#
C语言中没有专门的string字符类型,所以要想表示一系列的字符集合就要用到字符数组。
也就是说,在C语言中,字符串是用字符数组来表示的。
字符串的格式控制符是%s
,字符串要用""
来表示。
字符串是默认以'\0'
结尾的,所以'\0'
也称作字符串结束标志,或者字符串结束符。被" "
包围的字符串会自动在字符串的最后加'\0'
,而被''
赋值声明的字符串却不会在末尾自动生成'\0'
,需要我们自己加上。
字符串有三种初始化方式,一种是采用逐个字符赋值的初始化方式(也就是初始化数组的方式),一种是采用%s
的初始化方式,最后一种是用gets()
函数直接初始化一个字符串。
一、逐个字符赋值法
char op[20];
int i;
for(i = 0 ; i <= 19 ; i++)
{
scanf("%c",&op[i]);
}
单个字符的赋值还是需要加取地址符&
的。
通过程序运行可以发现,逐个字符赋值的初始化方式和整型数组的初始化是相同的,好像不加'\0'
也没什么问题
这时候就要思考为什么字符数组后面要加'\0'
的问题了
因为在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
字符数组中的内容,直接显示,可能会出现乱码.
因为编译器从物理内存中解释字符串时,从数组头部开始依次显示字符,编译器并不知道要到哪里结束,若把不属于字符串的内容当做字符串的内容来解释了,就会出现乱码.
因此要约定一下什么时候才算结束,这个约定就是‘\0’,使用‘\0’空字符作为结束符,代表字符串的结束,这是一种默认处理方式。
有了’\0’标志后,就不必再用字符数组的长度来判断字符串的长度了。
也就是说,字符数组最后要加'\0'
是一个规定,我们每次定义字符数组并且初始化的时候都要把'\0'
加上.
二、采用%s
初始化方式
char op[100];
scanf("%s",op);
//字符串的scanf声明方式中,op前不用加取地址符&,并且也不用具体到哪一个位置的字符,只写数组名即可
op[100] = "xxxxxxxxx"//也可以直接赋值,编译器会自动在最后补上一个'\0'
三、采用gets()函数初始化
char op[100];//利用字符数组来表示字符串
gets(op);
puts(op);
gets()
函数与puts()
函数经常一起使用,可以起到直接输入或者输出字符串的功能
需要注意的是gets()
函数与scanf()
在输入上的区别:
scanf()遇到空格就会默认输入结束,而gets()遇到回车才会默认输入结束
例1:
#include <stdio.h>
int main()
{
char ch1[10],ch2[10];
scanf("%s",ch1);
gets(ch2);
return 0;
}
依次键入asd空格fg回车
,asd空格fg回车
则ch1="asd\0",ch2="asd fg\0"
。
程序2:
#include <stdio.h>
int main()
{
char str1[20], str2[20];
scanf("%s",str1);
printf("%s\n",str1);
scanf("%s",str2);
printf("%s\n",str2);
return 0;
}
程序的功能是读入一个字符串输出,再读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:
测试一输入:
Hello word(回车)
输出:
Hello
world!
程序3:
#include <stdio.h>
int main()
{
char str1[20], str2[20];
gets(str1);
printf("%s\n",str1);
gets(str2);
printf("%s\n",str2);
return 0;
}
测试:
Helloworld! [ 输入 ]
Helloworld! [ 输出 ]
12345 [ 输入 ]
12345 [ 输出 ]
【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个 字符串 取了 Helloworld! 接受了空格符,而没有像上一个程序那样分成了两个 字符串 !
所以 如果要读入一个带空格符的字符串时因该用gets( )
, 而不宜用scanf( )
作者:Evinci
出处:https://www.cnblogs.com/evinci/p/17124001.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了