scanf扫描后从输入中删除了什么?

我经历了很多问题,博客和书籍,但我想我无法正确地解决问题。 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: %c\n", 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: %c\n", j++, c); 

fgets读取,直到遇到换行符或文件结尾,或者读取了SIZE-1字节。 假设您只希望该行包含一个整数,则此限制不应成为问题。 只要SIZE足够大,新行就会被fgets占用,循环中的后续getchar将按预期工作。

由于您使用的是Windows,因此在'\n'字符前面有一个'\r' '\n'字符。

“在你的while循环之前添加一个getchar(); ”技巧不起作用,因为这个getchar()获得了'\r'字符。 因此,当首次评估while条件时, c'\n'

所以一个简单的修复就是使用两个getchar()调用来消耗'\r\n' 。 但是,这不是非常便携,也就是说,它不适用于其他系统。

所以我会使用以下内容:

 int main() { int i; char c; scanf("%d", &i); if(getchar()=='\r') getchar(); while((c=getchar())!='\n') { printf("%c\n", 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("%d\n", i); while((c=getchar())!='\n'){ printf("%c-", c); } return 0; } 

我运行上面的代码与你一样: ./a.out < file Linux上的./a.out < file和使用mingw Windows,我没有看到任何问题。