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

时间:2014-05-02 14:02:30

标签: c scanf getchar

我经历了很多问题,博客和书籍,但我想我还没有能够正确地解决问题。 scanf扫描后做了什么?它会读取除空格,制表符和换行符之外的所有内容,但它对换行符有什么作用? 扫描输入后,我无法以任何方式删除换行符。 例如,将此视为输入: -

5
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
}

输入文件: -
5
ABCDEF
期待while循环运行,而它不会运行。因为它抓住了' \ n' 5.我尝试在scanf()和while()之间添加getchar(),但是程序卡住并且什么都不做。

4 个答案:

答案 0 :(得分:3)

如果在%d格式说明符中的scanf之后添加空格,scanf将不会返回,直到遇到任何非空白字符。这将有效地消耗输入中的任意数量的换行符或其他空格。正如@BlueMoon所指出的那样,请注意这个依赖来接收新行后接收更多非空白输入的程序。所以它适用于这个例子,但可能在其他地方引起麻烦。

这是一个最小的例子:

#include <stdio.h>

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将按预期工作。

答案 1 :(得分:1)

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

&#34;在getchar();循环之前添加while&#34;诀窍不起作用,因为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;
}

答案 2 :(得分:0)

您可以在getchar()调用后立即使用scanf()使用\n,以便它不会干扰您的循环。

scanf("%d", &i); 
getchar(); // To consume the trailing newline left 
           //in the input stream by scanf().

 while((c=getchar())!='\n'){
   //Do something
 } 

#include <stdio.h>

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上和使用mingw的Windows上,我没有看到任何问题。

答案 3 :(得分:0)

如果您接受字符或字符串输入,请在每个整数输入后使用getchar()。这将从输入缓冲区中删除\n

scanf("%d", &i);
getchar();
while((c=getchar())!='\n'){//Do something}