我是C的新手,但我知道C#。在C#中,我可以使用TryParse来确保用户输入正确的数据类型。
以下是我对C的基本代码:
int shallowDepth;
do
{
printf ("\nEnter a depth for the shallow end between 2-5 feet: ");
scanf ("%d", &shallowDepth);
if (shallowDepth < 2 || shallowDepth > 5)
{
printf("\nThe depth of the shallow end must be between 2-5 feet.");
}
}
while (shallowDepth < 2 || shallowDepth > 5);
问题是,如果我输入字符,例如“asdf”,程序会疯狂并反复说“输入2-5英尺之间的浅端深度:”。我不确定为什么会发生这种情况,但必须是因为它需要一个int而我正在传递字符。
那么在尝试将数据存储在变量中之前,如何验证用户输入的数据是否为int类型?谢谢。
答案 0 :(得分:3)
这种情况正在发生,因为%d
scanf
将拒绝触摸任何看起来不像数字的内容并将文本留在缓冲区中。下一次它将再次到达相同的文本,依此类推。
我建议您暂时放弃scanf
并尝试fgets
之类的内容,然后尝试strtoXXX
系列中的其中一项功能,例如strtoul
或{{1} }。这些函数具有明确定义的报告错误的方式,您可以轻松地提示用户提供更多文本。
例如你可以这样做:
strtoumax
此时您可以使用您的号码,但请注意:
char str[LENGTH];
long x;
if (!fgets(str, sizeof str, stdin)) {
/* Early EOF or error. Either way, bail. */
}
x = strtol(line, NULL, 10);
的指针,它将指向第一个不可接受的字符strtol
,则long
将设置strtol
。如果您打算测试,则必须在errno = ERANGE
errno = 0
答案 1 :(得分:0)
如果您想使用scanf
,则无法再进行测试。但你也不需要!
在您的代码中,如果用户未输入数字(或以数字开头的内容),scanf
将返回0,因为它返回了可以读取的参数数量。
因此,您需要检查scanf
的返回值,以检查是否可以读取任何内容。
其次,你需要删除仍在吹气中的所有东西。
你可以使用这样的东西:
while(getchar()!='\n');
如果你也想处理文件,你也应该在那里抓住EOF
。
答案 2 :(得分:0)
int shallowDepth;
int invalid;
do {
int stat;
invalid = 0;
printf ("\nEnter a depth for the shallow end between 2-5 feet: ");
stat = scanf ("%d", &shallowDepth);
if(stat != 1){
invalid = 1;
while(getchar() != '\n');//clear stdin
} else if (shallowDepth < 2 || shallowDepth > 5){
invalid = 1;
printf("\nThe depth of the shallow end must be between 2-5 feet.");
}
}while (invalid);