1

重複の可能性:
プログラムはscanf( "%c"、&yn);を使用したユーザー入力を待機しません。

Cでプログラミングを始めたばかりですが、奇妙なもの(C ++では遭遇しませんでした)がポップアップします。

ヘッダーファイルで、変数を宣言します(ファイルonemoretimeのコードを参照.h)。この変数の値は、後でユーザー入力を使用して設定されますscanf()。何らかの理由で、変数を使用する条件は正しく機能せず、無限に繰り返される結果を返すか、何もしません。いくつかのブレークポイントを設定しましたがonemoretime、関数で最初に呼び出されたときmain()に、の値がonemoretime何らかの理由でに設定されていることがわかりました\n

これは認識されるはずの値ではありませんscanf()が、入力は(明らかに)改行のように扱われます。を入力するyと、条件がトリガーelse ifされ、先頭にループバックするはずですがmain()、Xcodeのデバッガーは単純に次のように言います。error: 'y' is not a valid command.

これが私の.hファイルです:

#ifndef C1_Header_h
#define C1_Header_h

float num1, num2;
char op, onemoretime;

#endif

...そして、.cファイルからの関連コードは次のとおりです。

#include <stdio.h>
#include <math.h>
#include "Header.h"

int main(int argc, const char * argv[])
{
    printf("Enter a two-number calculation below:\n");
    while (1)
    {
        scanf("%f%c%f", &num1, &op, &num2);

        // addition
        if (op == '+')
        {
            printf("%f\n", num1+num2);
            printf("\nDone. Would you like to solve another math problem (y/n)?\n");
            scanf("%c", &onemoretime);
            while (1)
            {
                if (onemoretime == 'n') 
                {
                    printf("Ok. Terminating program.");
                    return 0;
                }
                else if (onemoretime == 'y') 
                {
                    // loop back to start main function
                }
            }
        }
    }
        // rest of code, irrelevant here
}

それが要因であるonemoretime場合、Xcodeの変数にカーソルを合わせると(その基本的なプロパティが表示されます)、ヘッダーファイルの最初の宣言の後の変数のすべてのインスタンスに値が表示されます\n

私は何が間違っているのですか?onemoretimeユーザーが値に到達する前にプログラムによって設定されるのではなく、ユーザーが値を設定するにはどうすればよいですか?

4

2 に答える 2

4

[ ]は、認識すべき\n値ではありません、[…]scanf()

これは一般的には当てはまりますが、「[の場合]では通常の空白文字のスキップは抑制され%cます」[リンク]。

取得するにopは、ではなく(linkonemoretime )を使用し、空白を処理することをお勧めします-自分でスキップします。fgetcscanf

于 2013-02-02T06:30:25.777 に答える
0

単一の文字を取得したいscanf()場合は常に、改行文字を吸収するために何かを使用する必要があります。次のようなことができます。scanf("%c\n",&onemoretime);

于 2013-02-02T07:05:22.777 に答える