2

ここでプログラマーを始めます...

私はコンピュータサイエンスのクラスのために非常に単純なプログラムを書いていますが、もっと知りたい問題に遭遇しました。これが私のコードです:

#include <iostream>

using namespace std;

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

    cout << "Will you be taking graduate or undergraduate level courses (enter 'U'"
            " for undergraduate,'G' for graduate.";
    cin >> courseLevel;

    if (courseLevel == "U")
    {
        cout << "You selected undergraduate level courses.";
    }

    return 0;
}

ifステートメントに対して2つのエラーメッセージが表示されます。1)文字列リテラルとの比較結果が指定されていません(代わりにstrncmpを使用してください)。2)ポインタと整数の比較('int'および'const char *')。

Uを一重引用符で囲むことで問題を解決したようです。そうでない場合、プログラムは少なくとも機能します。しかし、私が述べたように、私は自分が何をしているのかをよりよく理解できるように、なぜエラーが発生したのかを理解したいと思います。

4

3 に答える 3

5

代わりに一重引用符を使用する必要があります。

C (および他の多くの言語) では、文字定数は単一引用符で囲まれた単一の文字1です。

'U'

文字列リテラルは、二重引用符で囲まれた任意の数の文字ですが:

"U"

courseLevel単一の文字として宣言しました:char courseLevel;したがって、それを別の単一の とのみ比較できますchar

を行うif (courseLevel == "U")と、左側はchar、右側はconst char*--その文字列リテラル の最初へのポインタです。charあなたのコンパイラはあなたにこれを伝えています:

ポインタと整数の比較 (' int' と ' const char*')


したがって、オプションは次のとおりです。

if (courseLevel == 'U')       // compare char to char

または、例として:

if (courseLevel == "U"[0])    // compare char to first char in string

  1. 完全を期すための注意:複数文字の定数を使用できます:

    int a = 'abcd'; // GCC では 0x61626364

しかし、これは確かにあなたが探しているものではありません。

于 2013-02-07T05:12:20.350 に答える
3

Rapptz の言う通りですが、もう少し詳しく説明すると役立つと思います...

courseLevel == "U"

C および C++ では、二重引用符は文字列リテラルを作成します。これは、数値 0 の ASCII-NUL 終了標識文字で終わる文字の配列であり、プログラムがテキストの終了位置を認識できるようにします。したがって、基本的に、文字が文字の配列と等しいかどうかを尋ねています...それらは比較できません。有効な同様の質問は次のとおりです。

  • この文字変数は特定の文字値を保持しますか? courseLevel == 'U'
  • この文字変数は特定の配列に表示されますか: strchr(courseLevel, "U")
  • この文字変数は、特定の配列の最初の要素と一致しますか? courseLevel == "U"[0]

もちろん、これらの最初のものは、プログラムで直感的に理解できるものです。

于 2013-02-07T05:17:20.313 に答える
1

エラーが発生する理由は、C および C++ の文字列リテラルが null で終了する文字で終わるの\0に対し、単一の文字では終了しないためです。したがって、chara と文字列リテラルを比較すると、文字リテラルと char array を比較することになります{'U','\0'}

于 2013-02-07T05:08:57.917 に答える