2013-08-25 129 views
2

这可能是一个简单的问题,但我搜索了很多,但仍然没有弄明白。 我用gcc编译下面的snip代码并从终端运行程序。正确的,它允许输入一个int和一个字符,但它不会。它不会等待输入char?scanf()函数不起作用?

这里的任何人都可以帮助我,会友善的。提前致谢!

#include <stdio.h> 

int main() 
{ 

    char c; 
    int i; 

    // a 
    printf("i: "); 
    fflush(stdin); scanf("%d", &i); 

    // b 
    printf("c: "); 
    fflush(stdin); scanf("%c", &c); 

    return 0; 

}

+3

'fflush(stdin)'给你不确定的行为,不要这样做。 –

+0

你是否给它一个输入键以及输入? –

+1

fflush未在输入流中定义。太糟糕了一些C书实际上鼓励它。 – Kunal

回答

2

可以使用getchar()达到你想要的东西。

或使用消耗额外的换行符: -

scanf(" %c", &c); 
    ^^^ <------------Note the space 

原因: - 你的下一个scanf函数读取字符只是读取/消耗换行,因此从不等待用户输入

+0

替换'scanf(“%c”,&c);'''c = getchar();'显示同样的行为 – icktoofay

+0

我知道,但我想弄清楚它在这种情况下不起作用。 ,当我更改顺序// a和// b时,它会起作用 – dangnam2910

+0

您的下一个阅读字符的scanf只读取/消耗换行符,因此永远不会等待用户输入 –

6

%d会读连续的数字,直到它遇到非数字。 %c读取一个字符。可能发生的是你给它一个数字(几位数字),然后是一个新行。 %c然后读入该新行。您可能希望fflush(stdin);放弃任何尚未阅读的内容,但不幸的是,该内容为that's undefined behavior

的解决方案是读取字符前放弃所有空白:

scanf(" %c", &c); 

注意在开始的空间。这意味着放弃所有空白。

+0

这正是我所做的:输入一个数字,然后是一个新的行,它现在可以工作!非常感谢! – dangnam2910

2

代替fflush(stdin); scanf("%c", &c);

1.使用scanf的与额外的空间

scanf(" %c",&c); 

2.使用的getchar()两次,第一次读取 '\ n',该输入后给整数输入和第二次打电话要求你输入为c:

getchar(); 
c=getchar(); 

会帮助你。

1

首先,按照说明使用scanf。我认为下面的代码做你想要的。刷新Stdout,以便提示用户输入整数或字符。使用%1s允许像\ n那样的空白区域。

int main() 
{ 

    char c[2]; 
    int i; 

    printf("i: "); 
    fflush(stdout); 
    scanf("%d", &i); 

    printf("c: "); 
    fflush(stdout); 
    scanf("%1s", &c); 

    printf("\ni = %d, c = %c", i, c[0]); 

    return 0; 

} 

此代码已在Eclipse/Microsoft C编译器上测试/运行。

0

fflush()不保证做任何事情,而gcc/g ++不会。无论如何,不​​在Linux上。

我以为我发明了以下方法来刷新行的其余部分......直到我在ISO C规范中看到它作为示例(90或99 ...忘记了它,但它已经存在了很长时间无论哪种方式...我敢打赌,这里的大多数读者已经看到它。)

scanf(“%* [^ \ n]%c”);/丢弃一切直至包括下一个换行符*/

你可以把它放在你自己的“flush”函数中,以保存键入或粘贴遍布整个地方。

您应该仍然按照建议在scanf中放置一个空格(“%c”,& c);

如果在前导空格或输入键的双击中,耐心等待非空白字符。