我做了这个代码:
/*here is the main function*/
int x , y=0, returned_value;
int *p = &x;
while (y<5){
printf("Please Insert X value\n");
returned_value = scanf ("%d" , p);
validate_input(returned_value, p);
y++;
}
功能:
void validate_input(int returned_value, int *p){
getchar();
while (returned_value!=1){
printf("invalid input, Insert Integers Only\n");
getchar();
returned_value = scanf("%d", p);
}
}
虽然它通常工作得很好,但是当我插入例如“1f 1”时,它接受“1”并且不报告任何错误,并且当插入“f1 f1 f”时,它读取它两次并且破坏第二次读取/扫描等等(即第一次读取打印出“invalid input,Insert Integers Only”,而不是等待再次从用户重新读取第一次读取,它继续第二次读取并再次打印出“invalid input,Insert Integers Only”.
它需要最后的润色,我读了很多答案,但找不到它。
3条答案
按热度按时间cgfeq70w1#
如果你不想接受
1f1
作为有效的输入,那么scanf
是错误的函数,因为scanf
在找到匹配后会立即返回。相反,读取整行,然后检查它是否只包含数字。之后,您可以调用
sscanf
例如:
输入
输出
另一种方法-避免扫描
你可以让你的函数计算数字,从而完全绕过scanf。它可能看起来像:
zd287kbt2#
一般来说,我认为最好从输入中读取所有内容(当然是在缓冲区大小的范围内),然后验证输入是否确实是正确的格式。
在您的例子中,您会看到使用像 *
f1f1f
* 这样的字符串的错误,因为您没有阅读整个STDIN缓冲区。因此,当您再次调用scanf(...)
时,STDIN中仍然有数据,因此首先读入这些数据,而不是提示用户输入更多的输入。要阅读STDIN的全部内容,您应该执行以下操作(部分代码从Paxdiablo的答案中借用:https://stackoverflow.com/a/4023921/2694511):作为免责声明/说明:我已经很久没有用C语言写了,所以如果这个例子中有任何错误,我提前道歉。我也没有机会在发布之前编译和测试这段代码,因为我现在很匆忙。
t98cgbkg3#
如果您正在阅读一个输入流,您知道它是一个文本流,但您不确定它只由整数组成,那么就读取字符串。
此外,一旦您读取了一个字符串,并希望查看它是否是一个整数,请使用标准库转换例程
strtol()
。通过这样做,你都得到了一个确认,它是一个整数,你得到它转换为你的long
。添加注解:如果将
base
(strtol()
的最后一个参数)从10更改为0,则会获得额外的功能,即代码将十六进制数和八进制数(分别以0x
和00
开头的字符串)转换为整数。