当前位置:网站首页>七.getchar 和 scanf
七.getchar 和 scanf
2022-08-09 15:07:00 【榶曲】
目录
准备
- 空白字符:空格符、水平和垂直制表符、换页符和换行符
- 转换说明:%d、%s、%c等
getchar函数
C语言提供的一种度单个字符的方法
特点:
- 每次调用getchar函数时,它会读入一个字符并将其返回,必须使用复制操作将其存储到变量中。
- getchar返回的为接收字符的ASCII码值,返回一个int类型而不是char
getchar在缓存区接收字符
代码
int main()
{
int a = 0;
while ((a = getchar()) != EOF)
{
printf("%c\n", a);
}
return 0;
}显示

其中字符a和c之间有三行空白。
原因:
在键盘中输入字符是存储到内存缓冲区,getchar函数一次只能接收一个字符,当输入a后又进行了换行符'\n'的输入,使之进入循环,此时变量a中存储的是字符a的ASCII码值,进行printf输出,并且换行‘\n’,进入第一个空白行,
再次回到循环的判断条件,此时缓冲区中还存有输入字符a之后的换行符'\n',通过getchar接收后,此时变量a中存有字符'\n'的ASCII码值,进入循环后,两个换行符共换行两次。
scanf
转换说明%c允许scanf函数对单个字符进行行读
转换说明%s允许scanf函数把字符串读入字符数组
读入字符
代码
int main()
{
char a = 0;
while (scanf(" %c", &a) != EOF)
{
printf("%c\n", a);
}
return 0;
}使用scanf函数接收字符时,也存在接收空白字符的情况,
为了强制使scanf函数在读入字符前跳过空白字符,需要在格式串中的转换说明%c前加上一个空格
显示

读字符串
代码
int main()
{
char a[10] = { 0 };
scanf("%s", a);
printf("%s\n", a);
return 0;
}显示

原因
scanf函数会跳过空白字符,然后读入字符并且存储到数组中,直到遇到空白字符为止,scanf函数读入字符串永远不会包含空白字符。
因此,scanf函数通常不会读入一整行输入。
扩展
gets()函数
- 因为安全方面的原因,从C11起被废除了
- gets函数不会再开始读字符串之前跳过空白字符(scanf会跳过)
- gets函数会持续读入,直到找到换行符才停止(scanf函数会在任意空白字符处停止)
- gets函数会忽略换行符,不会把它存储到数组中,并用空字符代替换行符
数组越界
把字符读入数组时,scanf函数和gets函数都无法检测数组合适被填满。当数组越界时,会导致未定义的行为。
可以使用%ns代替%s,数字n指出可以存储的最多字符数。
对比
getchar优点
- getchar函数比scanf函数的执行速度更快
原因:
- scanf函数是设计用来按不同的格式读不同类型数据的,getchar比scanf要简单的多
- 为了额外的速度提升,通常getchar函数是作为宏来实现的
scanf优点
- 相对与getchar可以更方便写入字符串
- 可以改变转换说明读取输入个类型的数据
边栏推荐
猜你喜欢
随机推荐
位运算相关:2的幂、翻转图像、颠倒二进制位、N皇后II、比特位计数 ...
Detailed explanation of three pieces in C language
2022华数杯C题:插层熔喷非织造材料的性能控制研究 - 思路
后代选择器和子代选择器
2022华数杯A题 B题 C题 思路汇总
Heap series_0x09: Example of heap corruption (illegal access + uninitialized + heap handle mismatch)
3. Using Earth Engine Data
typescript学习(三)
js事件流
学习编程的第四天
在追梦的路上,唯独脚踏实地,才能梦想成真
C语言分支语句if,switch语句详细讲解
(一)BFC
while read line中执行ssh出现只执行一次
【挨踢(IT)初体验】
The first day of the real in CSDN
微信小程序学习(二)
文字样式的常见属性的如何使用?
WinServer 2019 组策略开启远程桌面
0. About The Author And Preface









