C 和 C++ 中输入 getchar、scanf、cin 和 getline 的使用
C语言的输入:
1. getchar()
int getchar(void); 是 <stdio.h> 中的库函数,作用是从 stdin 流中读入一个字符,返回对应的 ASCII 码,因此回车、空格等也能读取。
EOF -- end of file 文件结束符标志,键盘上用 Ctrl + Z 实现。
常用方法:从输入流读取的一个字符赋值给 ch,并判断是否为回车结束,或是否为 EOF
#include <stdio.h>
int main(){
char ch;
while((ch = getchar()) != '\n' && ch != EOF){
// 从输入流读取的一个字符赋值给ch,并判断是否为回车结束,或是否为 EOF(文件读入结束符)
...
}
}
2. scanf(...)
int scanf( const char *format [,argument]... );
- scanf是一个变参函数。(参数的数量和类型不确定)
- scanf的第一个参数是需要输入的字符串格式以及需要被读取的占位符。
- scanf的后续参数,是依次被读取并赋值的变量地址。
- 占位符的类型和数量需要与后续的参数类型和数量对应。
scanf 返回成功匹配的数据项数,失败则返回 EOF。
格式化字符串包括三类数据:
(1)格式化说明符;
(2)空白符(空格‘ ’、回车‘\n’、退格'\t'等);
(3)非空白符。
按格式输入,配套的格式符有:

对于 scnf 函数,'\n' 会触发 scanf 读取输入缓冲区的内容,遇下面情况时表示该数据结束:
(1) 遇 空格 或 回车 或 跳格(tab)
【scanf("%c", &ch) 能读到ASCII码对应的字符,包括空格/换行/跳格/转义符等】
(2) 按指定的宽度结束. 如3列的%3d
(3) 非法输入
对于格式化的字符串,在键盘输入时数据的顺序也要一一对应,否则出错返回,
scanf("%d,%d %c-%f", &a, &b, &ch, &f); // 输入:12,3 a-2.5
#include<stdio.h>
#include<string.h>
int main()
{
char ch[100];
scanf("%s", &ch); // abc回车
printf("%s", ch); // abc
char ch0 = getchar(); // 读取到scanf时的回车
printf("%c", ch0); // 回车
return 0;
}
abc
abc
请按任意键继续...
在 scanf 之后使用 getchar() 会读取到缓冲区中的 回车符,因此可以在 scanf 之后使用如下代码清空缓存区:
getchar(); // 读取一个换行符
或
while ((ch = getchar() != '\n') && ch != EOF); // 清空缓存区的回车
输入文件中的所有字符串,输入完则跳出:
while(scanf("%s", s) != EOF){ // 字符串之间空格或者回车隔开
...
}
- 按输入格式输入,否则输入结束:
while(scanf("%d", d) == 1){ // 格式不匹配时退出循环
...
}
C语言 scanf 读取带有空格 / 回车的字符串
%[] 格式控制符,基本格式为:%[scanfset]
- 以非 “^” 字符开头的 scanset , 表示在读入字符串时将匹配所有在 scanfset 中出现的字符,遇到非 scanfset 中的字符时输入就结束;
- 以 “^” 字符开头的 scanfset ,表示在读入字符串时将匹配所有不在scanfset 中出现的字符,遇到scanfset 中的字符输入就结束。
%[^\n] : 以回车符结束,同时回车符停留在缓存区中,能够被 scanf("%c", &c); 读取到单个回车符。
#include <stdio.h>
#include <string.h>
int main()
{
char str[1024];
char c;
scanf("%[^\n]", str); // abc空格cba回车
printf("===print str:\n%s", str); // abc空格cba
scanf("%c", &c); // scanf的回车
printf("===print char:\n%c", c); // 回车
return 0;
}
abc cba
===print str:
abc cba===print char:请按任意键继续. . .
%[^EOF] :以文件结束符标志 EOF ( 新行 Ctrl + Z) 结束
#include <stdio.h>
#include <string.h>
int main()
{
char str[1024];
char c;
scanf("%[^EOF]", str); // abc空格cba回车
printf("===print str:\n%s", str); // abc空格cba
scanf("%c", &c); // scanf的回车
printf("===print char:\n%c", c); // 回车
return 0;
}
abc cba..
abc
^Z
===print str:
abc cba..
abc
d
===print char:
d请按任意键继续. . .
C++ cin 和 getline 的使用
C++ 输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。
cin >> 流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。
getline 函数从 istream 中读取一行数据,包括前导和嵌入的空格,当遇到“\n”时结束返回。
在使用 getline 读入一整行时,
若是前面是使用getchar()、cin这类读入数据,但是不会读入后续换行 \n 符号或者空格的输入时,再接 getline() 就容易出现问题。
这是因为 cin 输入敲回车后,产生的换行符仍然滞留在输入流中,接着就被 getline(cin,s) 给读取并结束返回,此时s = “\n” ,所以实际上s只是读入了一个换行符 \n。
而若前面使用 getline(),再用 getline() 进行读入,此时不会发生问题。
因为 getline() 中读入结束的回车后,结束符不放入缓存区,会将读入的 \n 直接删除,下一个输入前,缓冲区为空,并不会因为回车留下\n。
所以当 cin>> 后使用 getline() 时,我们需要将输入流中的换行符进行手动清除,即调用cin.ignore(); 函数。
int main()
{
string str;
int n, m;
cin >> n >> m;
cin.ignore();
getline(cin,str);
cout << n << m << endl;
cout << str << endl;
system("pause");
return 0;
}
C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)