试图从用户读取一个输入整数,不想接受在字符C

问题描述:

您好我有一个函数在这里我只是想输入一个整数,我知道字符可以像整数对待,但在扫描时,我会喜欢只得到整数试图从用户读取一个输入整数,不想接受在字符C

+1

你是什么输入?你的预期产出是多少?你的实际产出是多少? –

+2

...不直接相关:但'setMaxGuess'的递归调用很腥。为什么你通过'guessNum'作为参数? –

+0

[如何清除C中的输入缓冲区]可能的重复(https://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c) – fongball

我认为你需要从标准输入读取,并拒绝数据,如果它不是一个整数。

您可以检查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);