7

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

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

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

4 回答 4

17

这是因为\n总是在那里使scanf("%c", &a) == 1总是真实的。
改变你的

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

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

之前的一个空格%c会吃掉(按)\n留下的这个。scanfEnter

于 2013-11-11T17:08:48.683 回答
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);
    }
}
于 2013-11-11T17:21:20.937 回答
1

结合其他帖子的一些功能和一些补充。
使用fgets()%n里面sscanf()。一定要检查结果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();
    }
  }
} 
于 2013-11-11T18:49:36.947 回答
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 个整数输入后,'space' 或 'enter' 或 'any single character' 都将被丢弃 "%*c",之后,除 'L' 或 'C' 之外的任何东西都会中断循环。

于 2020-06-05T14:17:26.183 回答