C scanf()问题?

4
在这个简单的猜数字游戏中,scanf()在main函数第二次使用时无法工作。希望有人能解释为什么它不起作用,以及如何修复它。 关于如何简化这段代码的任何提示都将不胜感激。谢谢!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int guessed = 0;
int guesses = 0;
int total_guesses = 0;
int range_top = 1;
int generate_random_number()
{
    srand(time(NULL));
    return (rand() % range_top);
}
void take_guess(int num)
{
    int guess;
    printf("what is your guess:  ");
    scanf("%i",&guess);
    if(guess == num)
    {
        guessed = 1;
    }
    else if(guess>num)
    {
        printf("Your guess was too high,\n");
    }
    else 
    {
        printf("Your guess was too low.\n");
    }

}
int main(void)
{
    printf("This is a game in C\n");
    printf("Would you like to play? (y/n): ");
    char play;
    scanf("%c",&play);
    while(play == 'y')
    {
        printf("I am thinking of a number between 0 and %i\n",range_top);
        int num = generate_random_number();
        while(guessed ==0)
        {
            take_guess(num);
            guesses++;
        }
        printf("It took you ");
        printf("%i",guesses);
        printf(" guesses to win.\n");
        printf("Would you like to play again? (y/n): ");
        scanf("%c",&play);
        guessed = 0;
        guesses = 0;
        total_guesses+=guesses;

    }
    printf("goodbye!");
}

1
srand移至generate_random_number之外。它只需要被调用一次。 - Eugene Sh.
1
注意:int generate_random_number() 是旧式写法。如果函数声明的参数列表为空,应该使用(void) - too honest for this site
不要使用 scanf。http://c-faq.com/stdio/scanfprobs.html - jamesdlin
1个回答

4

这是一个经典的新手错误。

scanf("%c",&play);

在读取 take_guess 中的数字后,会读取输入流中留下的换行符。

使用

scanf(" %c",&play);

如果在格式说明符的%c之前有一个空格字符,函数将从输入流中读取第一个非空格字符。否则,它将从输入流中读取第一个可用字符。

请使用%n来代替\n作为格式说明符,因为它可以在不打印任何字符的情况下记录已经打印的字符数。这使得它成为一种有用的调试技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接