我想检查给定的输入是否为整数输入。我不想将输入存储在字符串中。在看到有关stackoverflow和hit和trial的几个问题之后,我创建了以下代码
while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
printf("Please enter an integer only : ");
if(a == '\n')
scanf("%c",&a);
else
{
while(a != '\n')
scanf("%c",&a);
}
}
它有效但根据我的理解,以下应该也有效
while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
printf("Please enter an integer only : ");
while(a != '\n')
scanf("%c",&a);
}
有人可以告诉我为什么上面没有用?如果有人有更好的解决方案,请同时给它。
注意:我正在考虑将12qwe视为无效输入。我只想要整数。
答案 0 :(得分:3)
的问题
while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
printf("Please enter an integer only : ");
while(a != '\n')
scanf("%c",&a);
}
如果a
在扫描之前恰好包含'\n'
,并且扫描失败,则内部while
循环根本不会运行。所以
如果扫描尝试解析输入流中的int
失败,因为输入是例如"ab c\n"
,有问题的输入仍保留在输入流中,外部scanf
循环控件中的下一个while
无法再次解析int
,a
仍然'\n'
1}},重复。
如果在将流中的字符读入a
之前发生输入错误,则外循环控制中的scanf
会因为流已损坏而失败,重复。
在另一个版本中,
while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
printf("Please enter an integer only : ");
if(a == '\n')
scanf("%c",&a);
else
{
while(a != '\n')
scanf("%c",&a);
}
}
只要有要从流中读取的输入,您至少会取得一些进展,因为无论a
包含什么,您在尝试下一次解析{{{{}}之前,会从输入流中读取至少一个字符。 1}}。如果输入流被破坏/关闭/过早结束,例如,它也将导致无限循环。如果你从一个空文件重定向stdin。您可以通过提供诸如“a \ nb \ nc \ nd \ n”之类的输入来使该循环也输出多个int
消息。
因此,在转换输入中的任何内容之前,您应该检查"Please enter an integer only : "
是否遇到了流的结尾或其他一些读错误,并在这种情况下中止:
scanf
答案 1 :(得分:1)
这是一种错误的做法。您可以使用fgets()
读取输入,然后解析整数ASCII范围的字符串。
fgets(s, 1024, stdin)
for (i=0; s[i] ! = '\0';i++) {
if( s[i] <'0' && s[i] >'9')
// not an integer<br>
您还可以使用标准功能,例如isalnum
,isalpha
等。
答案 2 :(得分:1)
它有效......
while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
printf("Please enter an integer only : ");
do{
scanf("%c",&a);
}while(a != '\n');
}