所以我只是试图接受表单1 2,或0 0,2 2,0 1等的用户输入。如果用户第一次输入这个,那么一切都按预期工作。然而,如果他们从一开始就输入错误,程序就会告诉他们输入错误,并再次要求输入,但随后这个输入似乎被调换了,第一个变量是空白的,而第二个变量假定第一个变量的值。这是怎么呢
#include <stdio.h>
#include <stdlib.h>
int validation();
int main ( void ) {
int valid = 0;
while ( valid == 0 ){
valid = validation();
}
return 0;
}
int validation(){
char cfirst, csecond;
int first, second, c;
printf("Please enter your number:n");
scanf("%c %c", &cfirst, &csecond);
printf("cfirst = %c, csecond = %cn", cfirst, csecond);
if( cfirst == '0' ){
first = 0;
}
else if( ( cfirst == '1' || cfirst == '2' ) ){
first = cfirst - '0'; // alternative to atoi for a singular character
}
else{
printf("Move rejected. Please try againn");
while( ( c = getchar() ) != EOF && c != 'n');
return 0;
}
if( csecond == '0'){
second = 0;
}
else if( csecond == '1' || csecond == '2' ){
second = csecond - '0'; // alternative to atoi for a singular character
}
else{
printf("Move rejected. Please try againn");
while( ( c = getchar() ) != EOF && c != 'n');
return 0;
}
//first = cfirst - '0';
//second = csecond - '0';
printf("Your first number = %dn", first);
printf("Your second number = %dn", second);
return 0;
}
我试着用这行:
while((c = getchar()) != EOF &&C != 'n');
来清除输入缓冲区(我认为),这样scanf就会像第一次那样工作。这行不通!现在我很茫然。
当读取char
与scanf
时,您正在读取缓冲区中的所有字符,包括输入'n'。scanf
读取与声明的类型匹配的第一个可用数据,然后停止。如果您的程序第一次读取数据成功,它将存储值,但在缓冲区中保留输入'n'。当尝试第二次读取时,它会获取缓冲区中的前两个元素,在本例中是输入'n'和第一个值。当使用scanf
读取数据时,您应该始终清理缓冲区。可以使用scanf
while(getchar!='n')
清理缓冲区。希望有帮助!