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()非常に注意深く、何度も読むか、苦い経験 (またはそれに関する SO に関する多くの質問に答える) によって。scanf()関数ファミリーは非常に強力であり、正確に使用することは非常に困難です。私は通常fgets()、入力行を読むために使用することをお勧めします:

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

と組み合わせてsscanf()、ライン上のデータを解析します。一般的に、今遭遇したような驚きは少なくなります。scanf()期待どおりのコンバージョン数を達成したことを常に確認する必要があります。

scanf()-family 形式の文字列における空白の役割は複雑です。ほとんどの変換指定子は先頭の空白 (改行を含む) を自動的にスキップするため、フォーマット文字列"%d%d"は整数値に読み込まれます。最初の文字列の前には任意の量の空白があり、2 番目の文字列の前には任意の量の空白が続きます。空白。変換は、2 番目の整数の一部にすることができなかった最初の文字で停止します (以前にエラーがあった場合を除く)。および改行を8入力として入力すると、変換は改行 ( \n) で停止し、次の入力を読み取るために if を終了します。

数値変換と文字列変換%sはすべて、先頭の空白をスキップします。単一文字形式 ( %c) およびスキャン セット%[a-z]は、先頭の空白をスキップしません。

のように形式に空白文字が表示される"%d %c"場合、ゼロを含む、データ内の任意の量の空白を表します。したがって、次の各行では、%cフォーマットを受け取る変数がZ毎回取得されます。

123Z
123 Z
123        Z
123
               Z

(最後の入力として、最後の 2 行がまとめて読み取られます。)

于 2013-04-20T23:31:01.310 に答える