質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

while文がうまくいきません。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 415

L4zy

score 18

入力が正しくない場合に、続けるを選んだ後に、再度入力をうながしているのですが、なぜか入力の処理をさせてもらえずに、”入力値が正しくありません”と表示されてしまい、入力ができなくなってしまいました。
結構な時間悩んでもわからなかったので質問させていただいています。
分かる方助けてください。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int inputCheck(char myHand);
int main()
{
    int flg = 0, keep;
    char myHand, youHand;
    puts("じゃんけんゲーム!");

    while(flg == 0)
    {
        printf("手を入力してください【グー:1 チョキ:2 パー:3】:");
        scanf("%c", &myHand);
        if(inputCheck(myHand) == 1) flg = 1;
        else
        {
            flg = 0;
            puts("入力値が正しくありません。\n");
            printf("終了しますか?【終了:0 続ける:1】:");
            scanf("%d", &keep);
            if(keep == 0) exit(0);
        }
    }

    return 0;    
}

// 入力をチェックする関数 引数:入力値 戻り値:数値1 数値ではない0
int inputCheck(char myHand)
{
    if(myHand <= '3' && myHand >= '1')
    {
        return 1;    
    }

    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2020/04/22 16:42

    > 入力ができなくなってしまいました
    具体的に, 実行から終了(?)までの画面の状態を画像なりコピペなりでご質問に追加してくださいますか.

    キャンセル

  • L4zy

    2020/04/22 16:59

    scanf("%c", &myHand);の部分を%sにするのでも大丈夫ですか?

    キャンセル

  • jimbe

    2020/04/22 17:25

    大丈夫かと言われれば大丈夫ではありません.
    scanf は比較的入門時に扱う関数ですが, 実は使い方は結構難しく, それを説明するのも(入門時ということもあって)難しいです.
    どのような入力がされた時にどのような動作をするのか/させたいのかを調べながら試してみるのが良いかと思います.

    キャンセル

回答 2

+3

分かる方助けてください。

おそらく、「続ける」を入力するときに「1(エンター)」のように入力したかと思いますが、この改行が入力として残って、次の「手の入力」として解釈されてしまいます。

簡易的には1文字読み捨てるような方法もありますが、ある程度安定して入力したい場合は、「fgetsで1行取ってくる→sscanfで行ないから必要な値をピックアップ」のような方法が取られることもあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • この投稿は削除されました

  • 2020/04/22 17:02

    それだけでは正常に動きません(char1文字の領域を超えて書き込む危険があります)。

    キャンセル

  • 2020/04/22 17:07

    ということは、もし3文字入力したら、2文字捨てなければならないということですか?

    キャンセル

0

scanfの"%c"指定は結構厄介な動きをします。
"%s"で文字列として受け取って一部を読み取るか、
" %c"とすると、回避できるかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る