strcmpは、string.hをインクルードすれば、利用できます。
しかし正しく利用するには、その関数がどのように作られたものかを理解する必要があります。
以下では、この関数の定義例と利用例を紹介します。
char *s = "abc";
char a[] = "abc";
if( a == s ){
これで aとsが指す文字列が等しいかを比較できるでしょうか?
これで文字列の内容は、比較できません。
これは、それぞれの文字コードが並ぶ先頭位置のアドレスが等しいかの判定をしていることになります(ポインタの比較)
文字並びが等しいかを判定するには、
それぞれの位置にある文字が等しいかを、位置を変更しながら順次に比較する繰り返しが必要になります。
そして、これを行なっているのがstrcmp関数で、以下に定義例を示します。
この例の比較は、比較する文字コードの引き算を行なって、その差が0ならその文字一つが等しいと判断し、
次の文字の比較へ・・と繰り返すの方法です。
差が0の間だけ、または文字列の終端コード'\0'に達するまで
繰り返すことにより、全ての文字並びが一致しているか判定しています。
比較する文字コードの差をdif変数に記憶し、その差が0であれば等しいとして、次の並びを評価する繰り返しです。 違いが見つかるか、文字列終端を見つけるまで繰り返します。
#include <stdio.h> int strcmp(char *s1, char *s2) { int i = 0; int dif; /* 2つの文字コードの差記憶用 */ while( ( dif = s1[i] - s2[i] ) == 0 && s1[i] != '\0'){ i++; } return dif; /* 差を返す */ } main() { char *s = "abc"; char a[10]; int k; do { printf("文字列入力>" , a ); gets(a);/* 1行入力 */ k = strcmp(a , s); if( k == 0){ printf("入力した[%s]と[%s]は等しい。\n", a , s); } else if( k > 0){ printf("入力した[%s]は、[%s]より大きい。\n", a , s); } else { printf("入力した[%s]は、[%s]より小さい。\n", a , s); } } while (strcmp(a , "end") != 0); }
strcmp定義を確認するため、mainではsが指す文字列と比較する繰り返しにしています。 繰り返しは、endを入力するまで行い、その実行例を以下に示します。
文字列入力>abc 入力した[abc]と[abc]は等しい。 文字列入力>abcd 入力した[abcd]は、[abc]より大きい。 文字列入力>aa 入力した[aa]は、[abc]より小さい。 文字列入力>end 入力した[end]は、[abc]より大きい。
上記strcmpと同じ機能を行なわせる別の定義例を、以下に示します。
ここでは、添え字用変数iを使っていません。ポインタ引数の変数を変更することで、
比較する位置を変更しています。
■■■■ の記述を正しく直して完成くだささい。
([]の配列演算子を使わずに、*のポインタ演算子を使ってください。ポインタ変更は後置インクリメントを使ってください)
←編集 入力後に クリックください。
このようなポインタの変数を変更する方式は、C言語独特の作り方です。