2014-10-01 66 views
1

我是C编程新手,目前我正在学习while循环。我的问题是,while循环必须继续,直到用户希望终止while循环。但是,当我运行我的代码似乎scanf()只有一次扫描输入和while循环后终止,我不知道为什么。C编程:while循环中的scanf只读取一次输入,然后终止

int main(void) { 
    setbuf(stdout, NULL); 
    char answer = 'y'; 
    while (answer == 'y') { 
     printf("continue? (y/n): "); 
     scanf("%c", &answer); 
    } 
    return 0; 
} 
+0

为什么使用setbuf以(标准输出,NULL)' – Brandin 2014-10-01 17:59:19

+0

林的Windows用户的意图。当在Windows中同时使用printf和scanf时,c中的缓冲区有问题。为了让printf立即输出,你需要在每次printf后每次写入fflush(stdout)。如果你在开始时写setbuf(stdout,NULL),你不需要在每个printf之后写fflush(stdout)。 – Kim 2014-10-01 18:18:09

+0

是的,它可能在某些环境中是一个问题,但是你拥有它的方式可能实际上并不能解决所有问题,你不应该试试'setvbuf(stdout,NULL,_IONBF,0);' - 模式标志是什么改变了流的行为方式,例如评论这里http://www.eclipse.org/forums/index.php/t/168233/ – Brandin 2014-10-01 18:25:32

回答

0

您需要使用换行符。

变化

scanf("%c", &answer); 

scanf(" %c", &answer); 
+0

我怀疑这会给他想要的行为。考虑是否有人输入'是'。 – 2014-10-01 17:58:06

+0

哇。就像空间角色可以产生变化一样简单。感谢你的回答! – Kim 2014-10-01 18:07:27

+0

@DavidSchwartz,我不明白,如果有人输入'yes '而不是'y ',循环终止,如所设想的那样。 – 2014-10-01 18:07:28

0

y以外的每个字符都会终止循环。如果您点击y<newline>,则y将导致循环再次运行一次,然后换行将终止循环。

基本问题是,当您实际上想要读取一行时,您正在读取一个字符。