试图从用户读取一个输入整数,不想接受在字符C
我认为你需要从标准输入读取,并拒绝数据,如果它不是一个整数。
您可以检查scanf()
返回的值。这将是成功分配的数量。
int rv, c;
rv=scanf("%d", &guessNum);
if(rv!=1)
{
///Not an integer
while((c=getchar())!='\n' && c!=EOF);
}
这里,scanf()
将返回1
如果它分配一个值guessNum
否则0
将被退回。
但是,如果scanf()
没有分配给guessNum
由于不正确的输入,这些数据将保留在输入缓冲区这must be cleared读取后输入的数据之前。
while((c=getchar())!='\n' && c!=EOF);
会照顾到这一点。
This可能类似。
编辑:我刚看到Michael's评论。 您按值传递guessNum
到函数。您对此变量所做的更改不会反映到调用此函数的相应变量中。我想不出有什么理由这样做。
也许你想让你做出的改变反映回原始变量。 如果是这种情况,请将该变量的地址传递给函数(通过引用调用)。
然后函数声明必须更改为void setMaxGuess(gameState* game, int *guessNum)
,并且您应该在函数调用中将guessNum
的地址与&guessNum
一起传递。
首先,如果您正在使用递归,您需要一个合适的基本案例!此外,如果您希望在运行时输入用户,则不应将输入变量作为该函数的参数。
取而代之的只是使用一个临时变量(因为1.用你当前的代码,你不能传递一个常量给函数,2.传递一个全局变量将是无用的)。现在,如果您使用临时变量,您可以保持静态以防止在每次递归调用时重新声明。
此外,既然你想最大猜测(不知道),你也应该比较maxGuesses guessNum。
void setMaxGuess(gameState* game){
static int guessNum;
// Take input
if(guessNum < 0)
//Recurse
else if(game->maxGuesses > guessNum)
//Recurse
else{ //base case
game->maxGuesses = guessNum;
return;
}
}
这些是您的方法的一些问题。现在来检查用户是否输入了一个有效的整数。 你可以把输入作为int,并检查它是否不是char。在运行时检查可能会很麻烦(See this)。
但是,相反你可以把输入的字符数组(字符串,如果你愿意),并环通,并检查使用ISDIGIT()从ctype.h中
int isnum(char *str)
{
while (*str)
if (isdigit(*str++) == 0)
return 0;
return 1;
}
,如果不是数字抛出错误或其他方式使用来自string.h的atoi()转换回int。 注意:如果你不需要0作为输入,你可能刚刚使用atoi()来检查一个字符串是否是一个数字,因为它对于非数字值返回0。
一旦你做,你应该能够做这样的事情在main():
gameState g1;
g1.maxGuesses = 7; //Setting the initial max value
printf("Initial max value = %d\n", g1.maxGuesses);
setMaxGuess(&g1);
printf("Now the max value = %d\n", g1.maxGuesses);
你是什么输入?你的预期产出是多少?你的实际产出是多少? –
...不直接相关:但'setMaxGuess'的递归调用很腥。为什么你通过'guessNum'作为参数? –
[如何清除C中的输入缓冲区]可能的重复(https://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c) – fongball