使用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')isFALSEso 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())才会返回FALSEinteger
如果条件((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())是FALSE并且integer介于和之间1,23则while循环将中断,否则while循环将继续