0

谁能告诉我为什么我的代码可以正常工作,直到我到达最后一点,我问用户他们是否想再玩一次?由于某种原因,该程序似乎忽略了这行代码。请保持温柔,因为我是编程新手并试图自学 Objective-C。这个程序是典型的菜鸟,我生成一个随机数,让用户猜测,然后询问他们是否想再玩一次。谢谢你。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        int randomNumber = arc4random_uniform(100); // This is a random number generator that gens a num betw 0 and 100
        int userNumber;     // This is the number that the user picks intially
        int attempts = 0;   // This is the number of attempts the user makes during each game
        int games = 0;      // This is the number of games the user has played
        char play = 'n';    // This is whether the user wants to play again, intially set to 'y'

        scanf("%c", &play);
        while (play == 'y') {

            NSLog(@"Random number is: %d", randomNumber);
            NSLog(@"Enter a number between 0 and 100");
            scanf("%d", &userNumber);
            games++;    // Increment the number of games the user has played to 1

            if (userNumber == randomNumber) {
                attempts++;
                NSLog(@"Congratulations. You guessed correctly!");
            }

            attempts++;

            while (userNumber != randomNumber) {

                if (userNumber < randomNumber) {    // Guess is too low
                    attempts++;                     // attempt is incremented
                    NSLog(@"Too low. Try again!");  // User tries again
                    scanf("%d", &userNumber);
                }

                if (userNumber > randomNumber) {    // Guess is too high
                    attempts++;                     // attempt is incremented
                    NSLog(@"Too high. Try again!"); // User tries again
                    scanf("%d", &userNumber);
                }
            }
            NSLog(@"Congratulations. You guessed correctly!");
            NSLog(@"It took you %d attempts to guess correctly", attempts);


            NSLog(@"Do you want to play again?");
            scanf("%c", &play); // --------- Here is where things to wrong ---------

        } // while play is yes

    } // autoreleasepool
    return 0;
} // main
4

1 回答 1

1

将评论转换为答案:

可能,最后scanf()读取换行符并继续(数字不读取换行符)。也许在%c:

scanf(" %c", &play);

检查来自 的返回值scanf(),甚至可能检查读取了哪个字符。

反击:

成功之前的那个空间%c。怎么会有人学到那样的东西?我认为它正在读取\n字符而不是我希望它读取的内容,即“y”或“n”。据我了解,%d整数不会在换行符中读取,但是%c呢?那是对的吗?防止这种情况的方法是使用空间?我只是不明白我怎么会知道这样做。

和回应:

通过非常仔细地阅读手册页scanf(),多次阅读,或者通过痛苦的经历(或者通过回答很多关于它的问题)。该scanf()系列功能非常强大,而且很难准确使用。我通常建议使用fgets()来读取输入行:

char line[4096];
if (fgets(line, sizeof(line), stdin) != 0)
{
    ...use line...
}

结合sscanf()解析数据就行了。它通常会减少您刚刚遇到的那种意外。您应该始终检查是否scanf()进行了预期的转换。

scanf()-family 格式字符串中空格的作用是错综复杂的。大多数转换说明符会自动跳过前导空白(包括换行符),因此格式字符串"%d%d"将读取为整数值,其中第一个可能前面有任意数量的空白,第二个也可能前面有任意数量的空白白色空间。转换将在不能成为第二个整数的一部分的第一个字符处停止(除非之前出现错误)。如果您键入8和换行符作为输入,则转换将在换行符 ( \n) 处停止并保留 if 以供下一个输入读取。

数字转换和字符串转换%s都跳过前导空格。单字符格式 ( %c) 和扫描集%[a-z]不会跳过前导空格。

当空格字符出现在格式中时,如 中"%d %c",则它表示数据中的任意数量的空格,包括零。因此,在以下每一行中,接收%c格式的变量Z每次都会得到:

123Z
123 Z
123        Z
123
               Z

(最后两行一起读取最后一个输入。)

于 2013-04-20T23:31:01.310 回答