在while循环中使用scanf函数

时间:2013-11-11 17:06:51

标签: c while-loop scanf 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);
    }
}

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

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

4 个答案:

答案 0 :(得分:12)

这是因为\n总是让scanf("%c", &a) == 1始终为真 改变你的

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

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

%c之前的空格会占用\n留下的scanf(按 Enter )。

答案 1 :(得分:3)

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

char a;
char line[1024];

fgets(line, 1023, stdin);   // leave 1 character for null terminator
while(sscanf(line, "%c", &a) == 1){
    if(a == 'C'){
        int inputX, inputY, inputR;
        sscanf(line, "%d %d %d", &inputX, &inputY, &inputR);
        printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(a == 'L'){
        int x1, y1, x2, y2;
        sscanf(line, "%d %d %d %d", &x1, &y1, &x2, &y2);
        printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
}

答案 2 :(得分:1)

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

的结果
char line[1024];
while (fgets(line, sizeof line, stdin) != NULL)) {
  char *s = line; 
  char Type;
  int n;
  while(sscanf(s, " %c%n", &Type, &n) == 1) {
    s += n;
    if(Type == 'C') {
      int inputX, inputY, inputR;
      if (3 != sscanf(s, "%d %d %d%n", &inputX, &inputY, &inputR, &n)) {
        Handle_Syntax_Error();
      }
      s += n;
      printf("%d %d %d\n", inputX, inputY, inputR);
    }
    else if(Type == 'L') {
      int x1, y1, x2, y2;
      if (4 != sscanf(s, "%d %d %d %d%n", &x1, &y1, &x2, &y2, &n)) {
        Handle_Syntax_Error();
      }
      s += n;
      printf("%d %d %d %d\n", x1, y1, x2, y2);
    }
    else {
      Handle_Syntax_Error();
    }
  }
} 

答案 3 :(得分: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);
    }
}

“%[LC]”确保仅扫描'L'或'C'。相应地取3或4个整数输入后,“空格”或“输入”或“任何单个字符”都将被丢弃“%* c”,此后,除“ L”或“ C”之外的任何内容都将中断循环。