在while循环中使用scanf函数

Jul*_*val 4 c scanf while-loop c89

我正在尝试为编程分配格式化以空格分隔的用户输入.

本质上,输入由任意数量的表达式组成

L integer integer integer integerC integer integer integer.

例如:L 1 1 5 7 C 4 5 3.

到目前为止,我已经设法根据初始字符提取整数,并可以使用scanf函数迭代字符串:

char a;
while(scanf("%c", &a) == 1){
    if(a == 'C'){
        int inputX, inputY, inputR;
        scanf("%d %d %d", &inputX, &inputY, &inputR);
        printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(a == 'L'){
        int x1, y1, x2, y2;
        scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
        printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,虽然这会输出所需的整数,但循环(和用户输入提示)不会终止.

有人可以告诉我为什么会这样吗?

hac*_*cks 14

这是因为\n永远scanf("%c", &a) == 1都是真的.
改变你的

while(scanf("%c", &a) == 1) 
Run Code Online (Sandbox Code Playgroud)

while(scanf(" %c", &a) == 1)  
     //      ^space before format specifier.  
Run Code Online (Sandbox Code Playgroud)

之前的空间%c会吃了这个\n留下的scanf(上按Enter).

  • 原因很简单,我在上面的答案中解释过.当您按"Enter"键时,换行符'\n`将转到输入缓冲区.如果`a`是输入字符,那么输入缓冲区将包含`a \n`.首先`scanf`将读取`a`,在缓冲区中留下`\n`,以便下一次调用`scanf`.在进入循环时,你的第二个`scanf`将从输入缓冲区读取剩余的`\n`并循环运行一次而不等待你的输入,这就是为什么你得到两次"给一个字符"行. (3认同)