0Pricing
C Academy · レッスン

strcmp と比較

文字列を比較します。

「strcmp と比較」はCoddyKit上の無料C Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

文字列の比較

Cでは、==で文字列を比較することはできません。==で比較されるのは2つの配列のアドレスであり、内容ではありません。

<string.h>のstrcmp(a, b)を使って、文字ごとに比較してください。

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[] = "apple";
    char b[] = "apple";
    if (strcmp(a, b) == 0)
        printf("Strings are equal\n");
    return 0;
}

strcmpの戻り値

strcmpはintを返します。

  • 文字列が等しい場合は0
  • aとbで最初に異なる文字について、aの文字がbの文字より小さい場合は負の値
  • それ以外の場合は正の値
#include <stdio.h>
#include <string.h>

int main(void) {
    printf("%d\n", strcmp("abc", "abc"));
    printf("%d\n", strcmp("abc", "abd"));
    printf("%d\n", strcmp("abd", "abc"));
    return 0;
}

ゼロが等しいことを表すという落とし穴

よくあるバグは、等しいという意味になると考えてif (strcmp(a, b))と書いてしまうことです。

文字列が等しいとき、strcmpは0(偽)を返すことを思い出してください。そのため、この条件は文字列が異なるときに真になります。等しいかどうかを確認するときは、必ず0と明示的に比較してください。

#include <stdio.h>
#include <string.h>

int main(void) {
    char input[] = "yes";
    if (strcmp(input, "yes") == 0)
        printf("Confirmed\n");
    else
        printf("Not confirmed\n");
    return 0;
}

比較の仕組み

strcmpは、文字が異なるか終端文字に達するまで、各文字のASCII(バイト)値を1つずつ比較します。

大文字(A=65)は小文字(a=97)より前になるため、"Zebra"は"apple"より前に並びます。

#include <stdio.h>
#include <string.h>

int main(void) {
    printf("%d\n", strcmp("Zebra", "apple"));
    return 0;
}

辞書順

strcmpの符号を使うと、文字列をアルファベット順に並べ替えられます。負の値は、最初の引数が辞書順で先に来ることを表します。

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *x = "banana";
    const char *y = "cherry";
    if (strcmp(x, y) < 0)
        printf("%s comes before %s\n", x, y);
    return 0;
}

strncmp:範囲を限定した比較

strncmp(a, b, n)は最大n文字を比較します。接頭辞を確認するときに便利です。

たとえば、文字列が"http"で始まるかどうかを確認できます。

#include <stdio.h>
#include <string.h>

int main(void) {
    char url[] = "https://site.com";
    if (strncmp(url, "https", 5) == 0)
        printf("Secure URL\n");
    return 0;
}

大文字と小文字を区別しない比較

標準のstrcmpは大文字と小文字を区別します。区別しない場合は、比較中に<ctype.h>のtolowerで文字を変換できます。

(POSIXシステムにはstrcasecmpもありますが、C標準には含まれていません。)

#include <stdio.h>
#include <ctype.h>

int ci_cmp(const char *a, const char *b) {
    while (*a && (tolower(*a) == tolower(*b))) { a++; b++; }
    return tolower(*a) - tolower(*b);
}

int main(void) {
    printf("%d\n", ci_cmp("Hello", "hello"));
    return 0;
}

比較による検索

文字列の配列をループで処理し、strcmpを使って一致する文字列を探せます。これは簡単なルックアップテーブルのようなものです。

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *fruits[] = {"apple", "banana", "cherry"};
    const char *target = "banana";
    for (int i = 0; i < 3; i++) {
        if (strcmp(fruits[i], target) == 0) {
            printf("Found at index %d\n", i);
        }
    }
    return 0;
}

文字列の並べ替え

strcmpを比較処理として使うことで、文字列配列を並べ替えられます。次は、順序に基づいてポインターを入れ替える小さなバブルソートの例です。

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *names[] = {"Carol", "Alice", "Bob"};
    int n = 3;
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (strcmp(names[j], names[j+1]) > 0) {
                const char *t = names[j];
                names[j] = names[j+1];
                names[j+1] = t;
            }
    for (int i = 0; i < n; i++) printf("%s\n", names[i]);
    return 0;
}

減算を直接使って比較しない

a[i] - b[i]を使って独自の比較処理を書きたくなるかもしれません。しかし、生のchar値では符号の扱いが実装依存であり、オーバーフローする可能性もあります。

このような境界ケースを正しく処理するライブラリ関数strcmpを使用してください。

#include <stdio.h>
#include <string.h>

int main(void) {
    int r = strcmp("file1", "file2");
    printf("Result sign: %s\n", r < 0 ? "negative" : "non-negative");
    return 0;
}

ユーザー入力の比較

実用的な例として、パスワードやメニュー項目を確認する処理があります。入力を読み取り、strcmpで期待する値と比較してください。

等しいかどうかを確認するときは、必ず0と比較してください。

#include <stdio.h>
#include <string.h>

int main(void) {
    char choice[] = "quit";
    if (strcmp(choice, "quit") == 0)
        printf("Exiting program\n");
    return 0;
}

クイックチェック

strcmpの戻り値についての理解度を確認しましょう。

まとめ

Cで文字列を比較する方法について学びました。

  • strcmpは、等しい場合は0、順序に応じて負または正の値を返します。
  • 文字列に==を使ってはいけません。アドレスが比較されます。
  • 等しいかどうかを確認するときは、必ず== 0をテストしてください(ゼロは偽になるという落とし穴)。
  • strncmpは接頭辞を比較します。大文字と小文字を区別しない比較にはtolowerが必要です。

よくある質問

「strcmp と比較」レッスンは無料ですか?

はい。「strcmp と比較」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「strcmp と比較」で何を学びますか?

文字列を比較します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「strcmp と比較」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. strlen、strcpy、strcat
  2. strcmp と比較
  3. strtok とトークン化
  4. memcpy と memset
← C Academyに戻る