在while循环中使用scanf函数

问题描述 投票:5回答:4

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

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

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);
    }
}

不幸的是,尽管它输出所需的整数,但循环(和用户输入提示)不会终止。

有人能启发我为什么会这样吗?

c while-loop scanf c89
4个回答
16
投票

这是因为\n始终存在,以使scanf("%c", &a) == 1始终为真。更改您的

while(scanf("%c", &a) == 1) 

while(scanf(" %c", &a) == 1)  
     //      ^space before format specifier.  

%c之前的空格将吞噬\n留下的scanf(按Enter时。)>]


3
投票

原因是scanf直接从标准输入中读取,并且在处理完该行后会阻塞并等待用户输入。您需要做的是读取该行并在while循环中处理该行。我已经在下面修改了您的代码。


1
投票

结合其他帖子的一些功能和一些附加功能。在fgets()中使用%nsscanf()。请务必检查sscanf()的结果。


0
投票
char a;
    while(scanf("%[LC]", &a) == 1){
    if(a == 'C'){
        int inputX, inputY, inputR;
        scanf("%d %d %d%*c", &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%*c", &x1, &y1, &x2, &y2);
        printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.