C言語には、文字列の比較に使用できる 「strcmp」 という関数が存在します。
今回は、strcmp関数で文字列を比較する方法について、詳しく解説していきたいと思います。
C言語のstrcmp関数とは?
strcmp関数は、文字列の比較に使用できる関数の内の1つです。
2つの文字列を1文字ずつ比較し、その結果を整数値として返却します。
文字列全体が一致するかどうかだけでなく、異なる文字が含まれる場合に値の大小 (ソート順) を比較して返してくれるため、文字列を辞書順に並べたい時などにも活用することができます。
1文字だけを比較する場合
C言語では通常、文字列全体を比較する際に、等価演算子(==)を使用して比較をすることはありません。
他の言語の場合は値同士を比較するのに対し、C言語はポインタ同士の比較となるため、結果の正確性が保証されなくなってしまうからです。
ですが、文字列の中の特定の1文字のみを比較するケースなどにおいては、等価演算子を使用することができます。
後述する strncmp関数を使用して比較する方法もありますが、等価演算子を使って比較した方が、よりシンプルで見やすいコードを記述することができます。
以下のサンプルコードで確認してみましょう。
【サンプルコード】
#include <stdio.h>
int main(void) {
char *str = "sample";
if('s' == str[0]){
printf("1文字目はsです\n");
}else{
printf("1文字目はsではありません\n");
}
if('s' == str[1]){
printf("2文字目はsです\n");
}else{
printf("2文字目はsではありません\n");
}
return 0;
}
【実行結果】
1文字目はsです
2文字目はsではありません
正常に文字の比較が行えていることが分かりますね。
なお、余談ですが、C言語に限らずプログラミングでは、文字コードと呼ばれる表現方法で内部的に文字が取り扱われています。
文字コードとは、文字ごとに1対1で割り振られた番号のことで、文字の比較もこの番号を使用して行われています。
以下のサンプルコードを見てみてください。
【サンプルコード】
#include <stdio.h>
int main(void) {
char a = 'a';
char A = 'A';
printf("文字コード:%d\n", a);
printf("文字コード:%d\n", A);
return 0;
}
【実行結果】
文字コード:97
文字コード:65
結果に表示されている数値が、上述した文字コードです。
この数値を元に、同じ文字同士であるかの確認を行ったり、strcmp関数では値の大小の比較にも使用されています。
strcmpで文字列を比較する
ここから、strcmp関数の使い方について解説していきます。
基本構文と使い方
まずは、strcmp関数の基本構文から見ていきましょう。
strcmp関数を使用する際は、以下のように構文を記述します。
【基本構文】
strcmp(文字列1, 文字列2);
第1引数と第2引数には、それぞれ比較したい char型の配列 (文字列) の配列名、もしくは配列の先頭を指すアドレスを指定します。
【記述例】
strcmp(str1, str2);
// もしくは
strcmp(&str1[0], &str2[0]);
ポインタを引数に渡す必要があるので、配列の先頭アドレスを渡す場合は、&演算子をつけ忘れないよう注意しましょう。
関数の返り値は、文字列が全て一致しているか否かと、していない場合に文字の大小を比較した結果が数値で返却されます。
返却される値と対応する内容は、それぞれ以下の通りです。
- 文字列が全て一致している:0
- 第1引数が第2引数より小さい(ソートの昇順で先に来る方である): 負の値
- 第1引数が第2引数より大きい(ソートの昇順で先に来る方である):正の値
基本的には、結果が0か否か (文字列が一致するかどうか) を判断基準として使用するケースが多いかと思います。
文字の大小を判断する場合は、比較する文字列などによって値にばらつきがあるため、正と負のどちらであるかを基準に処理しましょう。
また、strcmp関数は文字列全体を比較するための関数なので、文字列の一部のみを指定して比較することはできません。
その場合は、「strncmp」という関数を使用して文字列の比較を行います。
strcmp関数とstrncmp関数のどちらも、使用の際には 「string.h」 ファイルをインクルードする必要があるため、以下のコードを忘れずに記述してください。
【ファイルの先頭に記述】
#include <string.h>
strcmp関数の実際の使い方を、以下のサンプルコードで確認してみましょう。
【サンプルコード】
#include <stdio.h>
#include <string.h>
int main(void) {
char *str1 = "sample";
char *str2 = "sample";
char *str3 = "SAMPLE";
char *str4 = "samply";
//str1とstr2を比較
if(strcmp(str1, str2) == 0){
printf("同じ文字列です\n");
}else{
printf("違う文字列です\n");
}
//str1とstr3を比較
if(strcmp(str1, str3) == 0){
printf("同じ文字列です\n");
}else{
printf("違う文字列です\n");
}
//異なる文字列同士の大小の差を比較
printf("%d\n", strcmp(str1, str3));
printf("%d\n", strcmp(str1, str4));
return 0;
}
【実行結果】
同じ文字列です
違う文字列です
1
-1
文字列が一致する場合とそうでない場合の違いが、それぞれ確認できるかと思います。
大文字と小文字の違いについては、結果を見ると分かるように、文字コードが大小で異なるため別の文字列として判定されます。(大文字の方が文字コードの数値は小さくなります)
また、文字の大小の差は、比較時に一番初めに見つけられた異なる文字を基準に判断されます。
範囲指定ができるstrncmpで文字列を比較する
上述したように、strcmp関数は文字列全体の比較のみが可能のため、範囲を指定して比較する場合は strncmp関数を使用します。
続いて、strncmp関数の使い方について見ていきましょう。
基本構文と使い方
初めに、strncmp関数の基本構文から見ていきましょう。
strncmp関数を使用する際は、以下のように構文を記述します。
【基本構文】
strncmp(文字列1, 文字列2, 比較する文字数);
第1引数と第2引数は、strcmp関数と同じように配列名か先頭アドレスを指定します。
第3引数には、先頭から数えて何文字目までを比較範囲に含むかを指定します。
例えば、「Hello」 という文字列に対して3と指定した場合、「Hel」 までが比較対象となります。
以下のサンプルコードで、実際の動きを確認してみましょう。
【サンプルコード】
#include <stdio.h>
#include <string.h>
int main(void) {
char *str1 = "sample";
char *str2 = "sample";
char *str3 = "SAMPLE";
char *str4 = "samply";
//str1とstr2を比較
if(strncmp(str1, str2, 3) == 0){
printf("同じ文字列です\n");
}else{
printf("違う文字列です\n");
}
//str1とstr3を比較
if(strncmp(str1, str3, 3) == 0){
printf("同じ文字列です\n");
}else{
printf("違う文字列です\n");
}
//str1とstr4を比較
if(strncmp(str1, str4, 3) == 0){
printf("同じ文字列です\n");
}else{
printf("違う文字列です\n");
}
return 0;
}
【実行結果】
同じ文字列です
違う文字列です
同じ文字列です
それぞれの文字列を、先頭から3文字分だけ比較するサンプルコードです。
指定の範囲内のみで結果を判断するため、文字列すべてが完全に一致しないものでも、上記のように同じ文字列であると判断される場合もあります。
なお、任意の箇所のアドレスを先頭として引数に指定することで、文字列の途中から比較を開始する応用方法もあります。
【サンプルコード】
#include <stdio.h>
#include <string.h>
int main(void) {
char *str1 = "sample";
char *str2 = "samply";
//後ろ3文字を比較
if(strncmp(&str1[3], &str2[3], 3) == 0){
printf("同じ文字列です\n");
}else{
printf("違う文字列です\n");
}
return 0;
}
【実行結果】
違う文字列です
strncmpで1文字だけを比較する
上述の応用方法を活用して、strncmp関数で任意の1文字だけを比較することもできます。
以下のサンプルコードで動作を確認してみましょう。
【サンプルコード】
#include <stdio.h>
#include <string.h>
int main(void) {
char *str = "sample";
//文字列内の一部をmと比較
if(strncmp("m", &str[0], 1) == 0){
printf("mと一致しました\n");
}else{
printf("mと一致しませんでした\n");
}
if(strncmp("m", &str[2], 1) == 0){
printf("mと一致しました\n");
}else{
printf("mと一致しませんでした\n");
}
return 0;
}
【実行結果】
mと一致しませんでした
mと一致しました
ポイントは、片方の引数に比較したい文字をダブルクォーテーションで囲って記述することと、比較する文字数を1文字にすることです。
C言語では、文字リテラルの場合はシングルクォーテーション、文字列の場合はダブルクォーテーションと役割が分けられています。
関数の仕様上、文字列として指定する必要があるため、必ずダブルクォーテーションで囲うようにしてください。
まとめ
今回は、C言語で文字列を比較する方法について解説しました。
それぞれの関数の特徴を覚えて、上手く活用していきましょう。
C言語の勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、C言語に限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。