Menu
Coddy logo textTech

strcmp() の使い方

CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 18/63。

strcat() を使って文字列を結合する方法を学びましたが、2つの文字列がまったく同じテキストを含んでいるかどうかを判断する必要がある場合はどうすればよいでしょうか?C言語では、等価演算子(==)を使って文字列を比較することはできません。なぜなら、それは実際のコンテンツではなく、メモリ番地のみを比較するからです。

<string.h> ライブラリの strcmp() 関数は、2つの文字列を文字ごとに比較することで、この問題を解決します。これは、辞書順比較(lexicographical comparison)と呼ばれる処理、つまり基本的には文字列を辞書順で比較する処理を行います。

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

char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2);  // 0を返す(文字列は等しい)

strcmp() 関数は、3つの異なるタイプの値を返します。文字列が同一である場合は 0 を、アルファベット順で最初の文字列が2番目の文字列より前にある場合は負の値を、最初の文字列が2番目の文字列より後にある場合は正の値を返します。

この関数は、ユーザー入力の検証、テキストデータのソート、プログラム内での検索機能の実装など、文字列の内容に基づいて判断を行うために不可欠です。

challenge icon

チャレンジ

簡単

strcmp() 関数を使用して、シンプルなパスワード検証システムを実装するC言語プログラムを作成してください。プログラムは以下の動作を行う必要があります:

  1. 処理するログイン試行回数を表す整数 n を読み取ります。
  2. 各ログイン試行について:
    • 入力からユーザー名を読み取ります。
    • 入力からパスワードを読み取ります。
    • strcmp() を使用して、ユーザー名を "admin" と比較します。
    • strcmp() を使用して、パスワードを "secret123" と比較します。
    • 比較結果に基づいて、適切なメッセージを表示します。
  3. すべての試行を処理した後、ログインに成功した回数をカウントして表示します。

ログイン検証のロジックは以下の通りです:

  • ユーザー名とパスワードの両方が正しい場合:"Login successful" と表示します。
  • ユーザー名は正しいがパスワードが間違っている場合:"Invalid password" と表示します。
  • ユーザー名が間違っているがパスワードは正しい場合:"Invalid username" と表示します。
  • ユーザー名とパスワードの両方が間違っている場合:"Invalid credentials" と表示します。

strcmp() 関数を使用するために、<string.h> ヘッダーをインクルードすることを忘れないでください。

出力は以下の形式で表示してください:

[Login result message]
[Login result message]
...
Total successful logins: [count]

例えば、入力が以下の場合:

4
admin
secret123
user
password
admin
wrong
guest
secret123

出力は以下のようになります:

Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1

このチャレンジでは、strcmp() を使用して文字列が一致するかどうかを比較する方法、文字列の比較結果に基づいた条件分岐ロジックの実装、および比較結果に基づいた出現回数のカウントについての理解をテストします。

チートシート

<string.h>strcmp() 関数は、辞書順比較を使用して 2 つの文字列を文字ごとに比較します。

#include <string.h>

char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2);

strcmp() は以下を返します:

  • 文字列が同一の場合は 0
  • 最初の文字列がアルファベット順で 2 番目の文字列より前にある場合は負の値
  • 最初の文字列がアルファベット順で 2 番目の文字列より後ろにある場合は正の値

C 言語では、== を使用して文字列を比較することはできません。これは内容ではなくメモリ番地のみを比較するためです。

自分で試してみよう

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

int main() {
    int n;
    scanf("%d", &n);
    
    char username[100];
    char password[100];
    int successful_logins = 0;
    
    // TODO: ここにコードを記述してください
    // strcmp() 関数を使用して各ログイン試行を処理します
    // ユーザー名を "admin" と、パスワードを "secret123" と比較します
    // 適切なメッセージを表示し、ログイン成功回数をカウントします
    
    printf("Total successful logins: %d\n", successful_logins);
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン