使用scanf("%d",&rows)
代替scanf("%s",input)
这允许您直接从标准输入获取整数值,而无需转换为 int。
如果用户输入一个包含非数字字符的字符串,那么您必须在下一个之前清理您的标准输入scanf("%d",&rows)
。
您的代码可能如下所示:
#include <stdio.h>
#include <stdlib.h>
int clean_stdin()
{
while (getchar()!='\n');
return 1;
}
int main(void)
{
int rows =0;
char c;
do
{
printf("\nEnter an integer from 1 to 23: ");
} while (((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin()) || rows<1 || rows>23);
return 0;
}
解释
1)
scanf("%d%c", &rows, &c)
这意味着期望用户输入一个整数并接近它一个非数字字符。
Example1:如果用户输入aaddk
然后ENTER
,scanf 将返回 0。Nothing capted
示例 2:如果用户输入45
然后ENTER
,scanf 将返回 2(2 个元素被捕获)。这%d
是字幕45
和%c
字幕\n
示例 3:如果用户输入45aaadd
然后ENTER
,scanf 将返回 2(2 个元素被捕获)。这%d
是字幕45
和%c
字幕a
2)
(scanf("%d%c", &rows, &c)!=2 || c!='\n')
在example1中:这个条件是TRUE
因为scanf return0
(!=2
)
在示例 2 中:这种情况是FALSE
因为 scanf 返回2
并且c == '\n'
在示例 3 中:这种情况是TRUE
因为 scanf 返回2
并且c == 'a' (!='\n')
3)
((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())
clean_stdin()
总是TRUE
因为函数总是返回1
在示例 1 中: is(scanf("%d%c", &rows, &c)!=2 || c!='\n')
所以TRUE
应该&&
检查之后的条件,所以clean_stdin()
将执行并且整个条件是TRUE
在示例 2 中: The(scanf("%d%c", &rows, &c)!=2 || c!='\n')
isFALSE
so that the condition after the&&
will not check (因为它的结果是整个条件将是FALSE
) 所以clean_stdin()
不会执行并且整个条件是FALSE
在示例 3 中: is(scanf("%d%c", &rows, &c)!=2 || c!='\n')
所以TRUE
应该&&
检查之后的条件,所以clean_stdin()
将执行并且整个条件是TRUE
所以你可以说clean_stdin()
只有当用户输入一个包含非数字字符的字符串时才会执行。
并且仅当用户输入 an而没有其他内容时,此条件((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())
才会返回FALSE
integer
如果条件((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())
是FALSE
并且integer
介于和之间1
,23
则while
循环将中断,否则while
循环将继续