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

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

ただいまの
回答率

88.80%

C言語で「constant expression」を付け忘れています。というエラーが出ました…どうしてでしょうか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,984
退会済みユーザー

退会済みユーザー

前提・実現したいこと

前回の質問同様様々なC言語コマンド理解のプログラム作成です。

発生している問題・エラーメッセージ

64行目」で記述エラーを発見しました。
「constant expression」を付け忘れています。

以下のソースコードの「case "午前":」が64行目にあたります。

該当のソースコード

#include <stdio.h>

void if_test(void);
void switch_test(void);

int main(){
    int imp;

    printf("C言語プログラミングテストです。\nテスト番号を入力して下さい > ");
    scanf("%d",&imp);

    switch(imp){
    case 1:
        if_test();
        break;
    case 2:
        switch_test();
        break;
    default:
        printf("そのテスト番号は存在しません。\n\n");
        main();
        break;
    }

    return 0;
}

~中略~

void switch_test(){
    char str[101];

    printf("switch文制御テストを実施します。\n\n問1:今は午前?午後?");
    gets(str);
    switch(str){
    case "午前"://64行目、エラー箇所
        printf("今ブラジルは午後です。");
        break;
    case "午後":
        printf("今ブラジルは午前です。");
        break;
    default:
        printf("指示されたことを入力しなさい。");
        break;
    }
}

試したこと

調べてみましたが分かりませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

C言語、ツールはEasyIDEC Ver. 0.0.6.0です。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Y.H.

    2016/11/18 20:40

    「該当のソースコード」が途中省略されているので、エラーメッセージある「64行目」が記載のソースコードのどの行にあたるのか分かりません。どの行でエラーになっているか明示するといいと思います。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/11/18 20:43

    修正依頼ありがとうございます、問題点に追加で記入しました。

    キャンセル

回答 3

checkベストアンサー

+3

C言語は(最近のモダンなプログラミング言語とは異なり)、switch-case文で文字列を正しく扱うことはできません。

char str[101];

switch(str){
case "午前": // ★ここと
case "午後": // ★ここがNG
default:
}

相当処理は、strcmp関数を用いてif-elseチェインで実現する必要があります。

if (strcmp(str, "午前") == 0) {
  //...
} else if (strcmp(str, "午後") == 0) {
  //...
} else {
  //...
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/18 20:55

    ご丁寧にありがとうございます!

    おかげで理解ができました!

    キャンセル

+3

caseラベルに指定する式は整数定数式(integer constant expression)でなければなりません(参照:N1570 6.8.4.2-3)。エラーメッセージは「constant expression」つまり「定数式」となっていますが、実際は「整数定数式」の事であり、caseの式が整数定数式ではないことを示しています。文字列リテラルは整数定数式ではないため、エラーになります。

エラーメッセージが正確ではないことは、EasyIDECが内部で使用しているTCCの不具合と考えられます。参考までに、各コンパイラのエラーメッセージは下記の通りです。

コンパイラ エラーメッセージ
tcc error: constant expression expected
clang error: expression is not an integer constant expression
gcc error: case label does not reduce to an integer constant
cl.exe error C2051: case expression not constant

※ C++では整数定数式を"integral constant expression"としているようです。日本語訳は同じですが、英語のニュアンスの違いはわかりません。
※ N1570 C11仕様書最終ドラフト。正式なISO/IEC 9899:2011と一部を除いて内容は同じです。
※ EasyIDECはTCCのエラーメッセージを日本語化しています。
※ 上記表の"cl.exe"はVisual C++のコンパイラです。"cl.exe"のみWindows、他のコンパイラはMacで確認しています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

C言語ではswitch - case 文で文字列は扱えません。
if - elseif でひとつひとつstrcomp()で比較してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • トップ
  • Cに関する質問
  • C言語で「constant expression」を付け忘れています。というエラーが出ました…どうしてでしょうか?