
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言語では文字列を == で比較してはいけない。
- == は「中身」ではなく「アドレス」を比較する。
- 間違ってもコンパイルエラーは出ない(ここが怖い)
- 今は数値に変換して比較する方法で対応する。
「なぜダメなのか」を理解していれば、
この仕様も怖くありません😊
