我经历了很多问题,博客和书籍,但我想我无法正确地解决问题。 scanf扫描后做了什么? 它读取除了空格,制表符和换行符之外的所有内容,但它对换行有什么作用? 扫描输入后,我无法以任何方式删除换行符。 例如,将此视为输入: –
五
ABCDEFGH
现在,我已将5扫描为整数,
scanf("%d", &i);
但是如何删除’ n’以便一次读取一个字符前面的所有内容? 我想用: –
while((c=getchar())!='n'){//Do something}
‘ n’应该是字符串之后的那个,但是getchar()在5之后得到一个并且循环在甚至运行一次之前终止。 我想我只是错过了一个小技巧。
scanf("%d", &i); while((c=getchar())!='n'){ //Do something with the character }
输入文件:-
五
ABCDEF
期待while循环运行,而它不运行。 因为它在5.之后捕获’ n’。我尝试在scanf()和while()之间添加getchar(),但是程序卡住并且什么都不做。
如果在scanf
格式说明符中的%d
之后添加空格,则scanf
在遇到任何非空白字符之前不会返回。 这将有效地消耗输入中的任意数量的换行符或其他空格。 正如@BlueMoon所指出的,请注意这依赖于程序在换行符后接收更多非空白输入。 所以它适用于这个例子,但可能在其他地方引起麻烦。
这是一个最小的例子:
#include int main() { int i, j=0; char c; scanf("%d ", &i); while((c=getchar())!='n') printf("%d: %cn", j++, c); return 0; }
样本输入:
5 abcdefg
输出:
0: a 1: b 2: c 3: d 4: e 5: f 6: g
编辑 :请注意,通过使用fgets
将行读入字符缓冲区,然后使用sscanf
提取整数,可以避免此问题:
char buff[SIZE]; fgets(buff, SIZE, stdin); sscanf(buff, "%d ", &i); while((c=getchar())!='n') printf("%d: %cn", j++, c);
fgets
读取,直到遇到换行符或文件结尾,或者读取了SIZE-1
字节。 假设您只希望该行包含一个整数,则此限制不应成为问题。 只要SIZE
足够大,新行就会被fgets
占用,循环中的后续getchar
将按预期工作。
由于您使用的是Windows,因此在'n'
字符前面有一个'r'
'n'
字符。
“在你的while
循环之前添加一个getchar();
”技巧不起作用,因为这个getchar()
获得了'r'
字符。 因此,当首次评估while
条件时, c
为'n'
。
所以一个简单的修复就是使用两个getchar()
调用来消耗'rn'
。 但是,这不是非常便携,也就是说,它不适用于其他系统。
所以我会使用以下内容:
int main() { int i; char c; scanf("%d", &i); if(getchar()=='r') getchar(); while((c=getchar())!='n') { printf("%cn", c); } return 0; }
如果您接受字符或字符串输入,请在每个整数输入后使用getchar()
。 这将从输入缓冲区中删除n
。
scanf("%d", &i); getchar(); while((c=getchar())!='n'){//Do something}
您可以在scanf()
调用之后立即使用getchar()
来使用n
以便它不会干扰您的循环。
scanf("%d", &i); getchar(); // To consume the trailing newline left //in the input stream by scanf(). while((c=getchar())!='n'){ //Do something }
#include int main(void) { int i, j=0; char c; scanf("%d", &i); getchar(); printf("%dn", i); while((c=getchar())!='n'){ printf("%c-", c); } return 0; }
我运行上面的代码与你一样: ./a.out < file
Linux上的./a.out < file
和使用mingw
Windows,我没有看到任何问题。
以上就是c/c++开发分享scanf扫描后从输入中删除了什么?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/518977.html