在while循环中使用scanf函数

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

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

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

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

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

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

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

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

%c之前的空格会消耗掉这个\n scanf\n后面(按Enter键 )。

原因是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); } } 

结合其他post的一些function和一些补充。
sscanf()使用fgets()%n 。 一定要检查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(); } } }