我试图解析一个格式为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");
}
}
2条答案
按热度按时间2wnc66cl1#
在代码中,您创建的主要障碍是尝试使用
scanf ("%s", str)
进行读取。%s
说明符将仅读取遇到的第一个空格之前的字符。如果您输入由空格分隔的3个整数,你将永远不会读取超过第一个到str
。这使得它不可能解析3-从str
到sscanf
的整数值,其包含的值不能超过1。要纠正此问题,可以直接用
scanf
读取3个整数值,例如:或者,处理面向行的输入的首选方法是使用面向行的输入函数
fgets
或POSIXgetline
。这将避免使用scanf
获取用户输入的许多陷阱,而这些陷阱是新的C程序员经常陷入的。Never, never, never usegets
,它是如此不安全,因此已从C11库中删除。使用
fgets
和sscanf
的等效示例为:使用/输出示例
(it两者相同)
把东西看一遍,如果还有问题就告诉我。
3bygqnnd2#
scanf("%s", str)
扫描文本,直到出现空格。因此,对于输入1 2 3
,str
被读取3次,内容为1
,2
,3
。请尝试改用
gets(str)
。