C用户只输入整数,从scanf返回值
我正在尝试获取一些用户输入,我希望确保他们输入整数,如果他们不输入,我将要求他们再次输入(循环直到他们正确输入) 我已经找到了很多不同的方法来做到这一点;有些比其他更复杂。但我发现这种方法似乎很有效 但我真的不明白为什么要在代码中进行测试:C用户只输入整数,从scanf返回值,c,return-value,user-input,scanf,C,Return Value,User Input,Scanf,我正在尝试获取一些用户输入,我希望确保他们输入整数,如果他们不输入,我将要求他们再次输入(循环直到他们正确输入) 我已经找到了很多不同的方法来做到这一点;有些比其他更复杂。但我发现这种方法似乎很有效 但我真的不明白为什么要在代码中进行测试: scanf("%d%c", &num, &term) != 2 我可以理解,scanf输出成功匹配和分配的项数,但我不明白为什么它输出2,如果它是整数 C语言中的代码是: int main(void) { int num;
scanf("%d%c", &num, &term) != 2
我可以理解,scanf
输出成功匹配和分配的项数,但我不明白为什么它输出2,如果它是整数
C语言中的代码是:
int main(void)
{
int num;
char term;
if (scanf("%d%c", &num, &term) != 2 || term != '\n')
printf("failure\n");
else
printf("valid integer followed by enter key\n");
}
尝试将其放入循环:
int main(void){
int m, n, dis;
char m_check, n_check, dis_check;
do{
m = 0; n = 0; dis = 0;
m_check = ' '; n_check = ' '; dis_check = ' ';
printf("Please enter number of rows m in the matrix (integer): ");
if(scanf("%d%c", &m, &m_check) !=2 || m_check != '\n')
m_check = 'F';
printf("Please enter number of columns n in the matrix (integer): ");
if(scanf("%d%c", &n, &n_check) !=2 || n_check != '\n')
n_check = 'F';
printf("Should the random numbers come from a uniform or normal distribution?...
Please press 1 for uniform or 2 for normal: ");
if(scanf("%d%c", &dis, &dis_check) !=2 || dis_check != '\n' || dis != 1 || dis !=2)
dis_check = 'F';
}while(m_check == 'F' || n_check == 'F' || dis_check == 'F');
我试着输入m=3,n=3,dis=2,然后循环重新开始,让我输入行数。如果我被要求按f或其他什么,它就会在printf语句上疯狂地循环:)
scanf
返回它转换的字段数。您有格式字符串%d%c
;它有:
%d
-第一个字段%c
-第二个字段scanf
返回2
如果用户输入一个数字,例如123
并按Enter键,则您的num
将等于123
,而术语将为\n
如果用户输入一个末尾带有垃圾的数字,例如123垃圾
并按Enter键,则您的num
将等于123
,项
将为g
,并且arbage\n
将保留在输入缓冲区中
在这两种情况下,scanf
读取int
和char
,因此返回2
另一个示例:用户输入垃圾123
。在这种情况下,scanf
将无法读取整数,并返回0
因此,您的代码会检查两种不同形式的错误输出。scanf
返回它转换的字段数。您有格式字符串%d%c
;它有:
scanf("%d%c", &num, &term) != 2
%d
-第一个字段
%c
-第二个字段
所以scanf
返回2
如果用户输入一个数字,例如123
并按Enter键,则您的num
将等于123
,而术语将为\n
如果用户输入一个末尾带有垃圾的数字,例如123垃圾
并按Enter键,则您的num
将等于123
,项
将为g
,并且arbage\n
将保留在输入缓冲区中
在这两种情况下,scanf
读取int
和char
,因此返回2
另一个示例:用户输入垃圾123
。在这种情况下,scanf
将无法读取整数,并返回0
因此,您的代码检查两种不同形式的错误输出
scanf("%d%c", &num, &term) != 2
这将检查scanf
的返回值。它将返回正确匹配的参数数。因此,如果输入了一个整数
和一个字符,它们将存储在vairablesnum
和term
中,并且scanf
返回值
2
scanf
将不会返回2
如果两个参数没有正确匹配,在这种情况下,故障
将显示为输出
这将检查scanf
的返回值。它将返回正确匹配的参数数。因此,如果输入了一个整数
和一个字符,它们将存储在vairablesnum
和term
中,并且scanf
返回值
2
scanf
将不会返回2
如果两个参数不正确匹配,在这种情况下,失败
将显示为输出。输入整数将与格式化程序%d
匹配,并将值分配给变量num
。%c
格式化程序将采用换行符('\n')并将其存储在变量term
中scanf
返回正确分配的2个原因2元素(num
和term
)
如果不输入整数,格式化程序%d
将无法正确匹配,并且scanf
将不会返回2,从而导致失败
编辑:您的do while循环变得疯狂,因为您在上次扫描中的条件错误(dis!=1 | | dis!=2
)。应该是
if(scanf("%d%c", &dis, &dis_check) !=2 || dis_check != '\n' || (dis != 1 && dis !=2))
输入整数将与格式化程序%d
匹配,并将值分配给变量num
。%c
格式化程序将采用换行符('\n')并将其存储在变量term
中scanf
返回正确分配的2个原因2元素(num
和term
)
如果不输入整数,格式化程序%d
将无法正确匹配,并且scanf
将不会返回2,从而导致失败
编辑:您的do while循环变得疯狂,因为您在上次扫描中的条件错误(dis!=1 | | dis!=2
)。应该是
if(scanf("%d%c", &dis, &dis_check) !=2 || dis_check != '\n' || (dis != 1 && dis !=2))
Oops-现在请看OP想知道为什么接洽失败了,并且不一定在寻找如何做。将此作为参考,因为它确实断言了基本问题:scanf()
。不要将其用于用户输入
如果代码确实需要“获取一些用户输入,并希望确保它们输入整数”,则使用fgets()
获取行,然后处理输入
将用户输入与扫描/解析混合在一起,必然会导致某些用户输入无法通过检查,在stdin
中出现额外的用户输入,或不正确地等待更多输入
// true implies success
bool Read_int(int *value) {
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) == NULL) return false; // EOF or error
// Now parse the input
char *endptr;
errno = 0;
long number = strtol(buffer, &endptr, 10);
if (errno) return false; // long overflow
if (number < INT_MIN || number > INT_MAX) return false; // int overflow
if (endptr == buffer) return false; // No conversion
while (isspace((unsigned char) *endptr)) endptr++;
if (*endptr) return false; // non-white-space after number
*value = (int) number;
return true;
}
//true意味着成功
bool Read_int(int*值){
字符缓冲区[100];
如果(fgets(buffer,sizeof buffer,stdin)=N