C言語入門|C言語で文字列を比較してはいけない理由:== が使えないワケを知る

if 文で条件分岐ができるようになると、
次にやりたくなるのが 「文字列による判定」 です🙂

たとえば、

入力された文字が「YES」なら処理を進める
それ以外なら別の処理をする

といった場面は、ゲームでも業務プログラムでもよく登場しますよね。
ところが、C言語ではここで 思わぬ落とし穴 が待っています。

「え? if 文で == を使えばいいんじゃないの?」
そう思った人ほど、要注意です⚠️

ついやってしまう文字列比較の例😅(ダメな例)

まずは、よくありがちなプログラムを見てみましょう。
※ 内容とメッセージは元の例から変更しています。

プロジェクト名:4-6-1 ソースファイル名: sample4-6-1.c

#include <stdio.h>

typedef char String[1024];

int main(void)
{
    String input;
    printf("合言葉を入力してください\n");
    scanf("%s", input);

    if (input == "OPEN") {   // 文字列を == で比較している
        printf("ドアが開きました\n");
    } else {
        printf("合言葉が違います\n");
    }

    return 0;
}

一見すると、とても正しそうに見えますよね🤔
でもこのプログラム、期待どおりには動きません。

どんな文字を入力しても、

合言葉が違います

と表示されてしまいます。

しかも厄介なことに、
コンパイルエラーは一切出ません。

なぜ == で文字列を比較できないの?🤨

理由を一言で言うと、次のとおりです。

C言語において、文字列は「値」ではなく「場所(アドレス)」だから

C言語には、
Java や Python のような 文字列専用の型 が存在しません。

よく使っている文字列は、実際にはこうなっています。

見た目実体
"OPEN"文字が並んだメモリ領域
String input文字配列(char の集まり)

== が比較している本当のもの🧠

if 文のこの部分を思い出してください。

if (input == "OPEN")

ここで == が比較しているのは、

  • input に格納された 先頭アドレス
  • "OPEN" という文字列リテラルの 先頭アドレス

つまり、

「文字の内容」ではなく
「置いてある場所が同じかどうか」

を比較しているのです😱

図のイメージ

  • input → キーボード入力された文字列が入ったメモリ
  • "OPEN" → プログラム中に用意された別のメモリ領域

この2つは、
たとえ文字が同じでも、別の場所に存在する ため、
== の結果は false になります。

これが「文字列を比較してはいけない理由」⚠️

C言語では、次のことを覚えておきましょう。

比較対象== で比較できる?
int や doubleできる
char(1文字)できる
文字列(char配列)できない

これを、今後の学習では
「文字列に関する第5のルール」
として覚えておくと安心です🙂

今は我慢!文字列の代わりに数値で判定する方法🔢

「じゃあ、文字入力が必要なプログラムは作れないの?」
と思ったかもしれませんが、大丈夫です👍

数値に変換して比較する という回避策があります。

数値を使った安全な例✨

プロジェクト名:4-6-2 ソースファイル名: sample4-6-2.c

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

typedef char String[1024];

int main(void)
{
    String choice;
    printf("好きな飲み物を選んでください\n");
    printf("1:コーヒー 2:紅茶 3:ジュース\n");
    scanf("%s", choice);

    int n = atoi(choice);   // 文字列 → int に変換

    if (n == 3) {
        printf("ジュースを選びました\n");
    } else {
        printf("別の飲み物を選びました\n");
    }

    return 0;
}

このプログラムのポイント

処理説明
scanf文字列として入力を受け取る。
atoi数値の文字列を int に変換する。
==int 同士なので正しく比較できる。

これなら、
C言語のルールに反することなく条件分岐 ができます😊

atoi って何をする命令?🛠️

ここで使っている atoi は、次のような命令です。

項目内容
命令名atoi
役割数値の文字列を int に変換
"123" → 123

数字として入力されている前提ですが、
学習段階ではとても便利な命令です。

まとめ:文字列は特別扱いしよう🎯

今回のポイントを整理しましょう。

  • C言語では文字列を == で比較してはいけない。
  • == は「中身」ではなく「アドレス」を比較する。
  • 間違ってもコンパイルエラーは出ない(ここが怖い)
  • 今は数値に変換して比較する方法で対応する。

「なぜダメなのか」を理解していれば、
この仕様も怖くありません😊