[TA] C言語: strcmpについて

[TA] C言語: strcmpについて - TODO

文字列比較関数strcmpについて解説します.

簡単な実行例

サンプルプログラム

sample.c

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

void compareName(char* name1, char* name2);

int main(int argc, char argv[]) {
   char* name1 = "Andre";   // アンドレさん
   char* name2 = "Brick";   // ブリックさん
   char* name3 = "Charles"; // チャールズさん
   char* name4 = "David";   // ディビッドさん
   char* name5 = "Eric";    // エリックさん

   compareName(name1, name2);
   compareName(name2, name3);
   compareName(name3, name4);
   compareName(name4, name5);
   compareName(name1, name1);
   compareName(name5, name2);
   compareName(name4, name1);
}

void compareName(char* name1, char* name2) {
   printf("compare %s with %s\n", name1, name2);

   if(strcmp(name1, name2) == 0) {
      printf(" ---> draw.\n");
   } else if(strcmp(name1, name2) > 0) {
      printf(" ---> %s is smaller than %s.\n", name2, name1);
   } else if(strcmp(name1, name2) < 0) {
      printf(" ---> %s is smaller than %s.\n", name1, name2);
   }
}

実行結果

$ gcc sample.c -o sample                                                                   
$ sample

compare Andre with Brick
 ---> Andre is smaller than Brick.
compare Brick with Charles
 ---> Brick is smaller than Charles.
compare Charles with David
 ---> Charles is smaller than David.
compare David with Eric
 ---> David is smaller than Eric.
compare Andre with Andre
 ---> draw.
compare Eric with Brick
 ---> Brick is smaller than Eric.
compare David with Andre
 ---> Andre is smaller than David.

解説

文字列の大小の判定は,数字のものとは少し違います.簡単に言ってしまうと「英語の辞書で先に出てくるものほど小さい」ということです.

上の実行例では,「アンドレ」「ブリック」「チャールズ」「ディビッド」「エリック」の5人を名前で比較しています.出席番号が早い人を「小さい」としています.同姓同名の人がいたら「引き分け」です.

演習課題2におけるstrcmpの役割

演習課題1で実行したサンプルでは,meibo中のint型のメンバ変数であるageをキーにして,2分探索を行っています.このとき,meiboの要素はage順にソートされている必要があります.ソートされていないデータに対しては2分探索をできないので注意してください.

課題2では,2分探索ではなくて逐次探索を行います.つまり,長さ$N$の配列の0番目の要素から$N-1$番目の要素までを順に比較していき,一致するものがあるかどうかを調べます.一致するかどうかをstrcmpを用いて比較します.

なので,実を言ってしまうと,今回の課題ではstrcmpの3種類の引数(0,正,負)のうち0しか使いません.meiboがnameでソートされていて,2分探索を行うときにはstrcmpが大活躍します.

[Good Job!]