我正在尝试解析格式为
x y z
(包括空格)的输入字符串,以便在输入的字符串有效时退出循环。但是,当我运行这段代码时,它输出了 3 次“格式不正确”,每次都是 valid = 1
。有没有其他方法可以让它工作而无需手动解析它?
int valid = 0, x, y, z;
char str[20];
while (valid != 3) {
scanf("%s", str);
valid = sscanf(str, "%d %d %d", &x, &y, &z);
if (valid != 3) {
printf("Incorrect format\n");
}
}
在您的代码中,您创建的主要障碍是尝试使用
scanf ("%s", str)
进行读取。 %s
格式说明符只会读取遇到的第一个空格之前的字符。如果输入由空格分隔的 3 个整数,则读入 str
的次数永远不会超过第一个。这使得无法从 sscanf
中解析带有 str
的 3 整数值,它可以包含不超过 1.
要更正此问题,请直接使用
scanf
读取 3 整数值,例如
#include <stdio.h>
int main (void) {
int x, y, z;
printf ("enter 3 integers: ");
if (scanf ("%d %d %d", &x, &y, &z) != 3) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
printf ("x : %d\ny : %d\nz : %d\n", x, y, z);
return 0;
}
或者,处理 line-oriented 输入的首选方法是使用 line-oriented 输入函数
fgets
或 POSIX getline
。这将避免新 C 程序员经常掉入的使用 scanf
获取用户输入的许多陷阱。 从不,从不,从不使用gets
,它是如此不安全,已从C11库中删除。
使用
fgets
和 sscanf
的等效示例是:
#include <stdio.h>
#define MAXC 128
int main (void) {
int x, y, z;
char buf[MAXC] = "";
printf ("enter 3 integers (on a single line): ");
if (fgets (buf, MAXC, stdin) == NULL) {
fprintf (stderr, "error: user canceled input.\n");
return 1;
}
if (sscanf (buf, "%d %d %d", &x, &y, &z) != 3) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
printf ("x : %d\ny : %d\nz : %d\n", x, y, z);
return 0;
}
示例使用/输出
(两者都一样)
$ ./bin/rd3int
enter 3 integers: 10 12 14
x : 10
y : 12
z : 14
仔细查看,如果您还有其他问题,请告诉我。
scanf("%s", str)
扫描文本直到出现空格。所以对于输入1 2 3
,str
被读取3次,内容为1
, 2
, 3
.
尝试使用
gets(str)
代替。