Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C';s scanf函数。如果使用宽度修改器,例如:%5d。如何防止用户输入的任何多余数字被读入下一个%d说明符?_C_Scanf - Fatal编程技术网

C';s scanf函数。如果使用宽度修改器,例如:%5d。如何防止用户输入的任何多余数字被读入下一个%d说明符?

C';s scanf函数。如果使用宽度修改器,例如:%5d。如何防止用户输入的任何多余数字被读入下一个%d说明符?,c,scanf,C,Scanf,我希望用户输入2个数字,并使用scanf函数将这两个数字读入2个int变量 int num, num2; scanf("%5d %d", &num, &num2); printf("num = %d\n", num); printf("num2 = %d\n", num2); 如果用户输入的第一个数字的位数大于5,则应丢弃多余的数字 例如:如果用户在提示下输入以下内容 % 12345678 222<Enter> num = 12345 num2 = 678 我已

我希望用户输入2个数字,并使用
scanf
函数将这两个数字读入2个
int
变量

int num, num2;

scanf("%5d %d", &num, &num2);
printf("num = %d\n", num);
printf("num2 = %d\n", num2);
如果用户输入的第一个数字的位数大于5,则应丢弃多余的数字

例如:如果用户在提示下输入以下内容

% 12345678 222<Enter>
num = 12345
num2 = 678
我已将我的
scanf
功能模式修改为以下内容:

scanf("%5d %*[0123456789] %d", &num, &num2 );
这似乎解决了问题,如果用户输入的第一个数字超过5位,但如果是5位或更少,此格式说明符将丢弃用户输入的第二个数字,并且需要输入第三个数字

例如:如果用户在命令提示符下键入以下内容:

% 12345 222 333 <Enter>
num = 12345
num2 = 333

任何C专业人士都可以提供解决方案,谢谢。

我觉得这里的目标有问题。默默地忽略用户输入,即使你认为它是不正确的,对用户来说是非常混乱的,并且可能导致复合错误。


无论如何,您不可能通过调用
scanf
来实现这一点。因此,您需要分块执行:使用
scanf
读取最多五个字符作为整数。然后
getc
下一个字符;如果它是一个数字(请参见
isdigit()
),请丢弃它并重复。最后,
scanf
第二个整数。

这里的目标让我觉得有问题。默默地忽略用户输入,即使你认为它是不正确的,对用户来说是非常混乱的,并且可能导致复合错误。


无论如何,您不可能通过调用
scanf
来实现这一点。因此,您需要分块执行:使用
scanf
读取最多五个字符作为整数。然后
getc
下一个字符;如果它是一个数字(请参见
isdigit()
),请丢弃它并重复。最后,
scanf
是第二个整数。

问题是扫描集前面的空间,而且扫描集必须匹配才能移动到下一个字段。试试这个:

scanf("%5d%*[0123456789]", &num);
scanf("%d", &num2);
需要2次scanf调用,因为如果第一个数字小于等于5位,扫描集将不匹配


(您必须检查两者的返回值)

问题在于扫描集之前的空间,而且扫描集必须匹配才能移动到下一个字段。试试这个:

scanf("%5d%*[0123456789]", &num);
scanf("%d", &num2);
需要2次scanf调用,因为如果第一个数字小于等于5位,扫描集将不匹配



(您必须检查两者的返回值)

为什么不能测试接收到的值并将其截断?测试该值是否大于99999(5位),如果大于99999,请将其转换为字符串,仅保留字符串中的前5位,然后将其转换回整数。你可能也能从数学上做到这一点。一次读取并丢弃一个字符,直到遇到一个空白字符(或任何字符)。或者,读一整行,然后用
strtol
strchr
等轻松地将其分开。;一般来说,您根本不应该在用户输入上使用
*scanf()
(因为它告诉您在哪一点错误输入的确切错误的功能是有限的)。仅对已知格式良好的数据使用
*scanf(),这可以解决问题。为什么不能测试接收到的值并截断它呢?测试该值是否大于99999(5位),如果大于99999,请将其转换为字符串,仅保留字符串中的前5位,然后将其转换回整数。你可能也能从数学上做到这一点。一次读取并丢弃一个字符,直到遇到一个空白字符(或任何字符)。或者,读一整行,然后用
strtol
strchr
等轻松地将其分开。;一般来说,您根本不应该在用户输入上使用
*scanf()
(因为它告诉您在哪一点错误输入的确切错误的功能是有限的)。仅对已知格式良好的数据使用
*scanf(),这可以解决问题。你可以使用扫描集that@antti:是的,你可以,但如果你按我的方式做,你会得到更好的诊断选项。你可以使用扫描集进行诊断that@antti:是的,你可以,但如果你按我的方式做,你会得到更好的诊断选项。@jason进行了2次扫描调用?嗨,Antti,在深入阅读了你的评论后,现在知道了,感谢heaps:)但请注意,如果scanf试图匹配不适合int的字符串(例如,如果int_MAX为2147483647,输入字符串为3147483647)@jason,且有两次scanf调用,则使用
%d
而没有最大宽度,则可能是未定义的行为。嗨,Antti,在深入阅读了您的评论后,现在就知道了,感谢heaps:),但请注意,如果scanf试图匹配不适合int的字符串(例如,如果int_MAX为2147483647,而输入字符串为3147483647),则任何未使用最大宽度的
%d
都可能是未定义的行为
scanf("%5d%*[0123456789]", &num);
scanf("%d", &num2);