strcmp()関数について教えてください

このQ&Aのポイント
  • strcmp()関数は、文字列を比較するための関数です
  • この関数は、引数として与えられた2つの文字列を辞書順に比較し、その結果を返します
  • もしstrcmp(a, b)が0を返す場合、aとbは同じ文字列とみなされ、それ以外の場合は異なる文字列とみなされます
回答を見る
  • ベストアンサー

strcmp( )関数について教えて下さい

 今日は、Cの初心者です、宜しくお願いします。  a,bが一文字のとき、「if(strcmp(a,b)==0)」では、a,bの大小は辞書に出てくる順序を返すとありますが、 a="abcde",b="xyz"として「if(strcmp(a,b)==0)」とかくと、これは文字の長さを比較するのでしょうか。  それとも先頭文字のについて、辞書に出てくる順序の大小を返すのでしょうか。  本を読むと単に「比較する」とだけしか書いてないのですが、一体「文字」又は「文字列」の何を比較するのでしょう。  「辞書に出てくる順序」なのでしょうか、それとも「長さ」なのでしょうか。  一方が文字列(p="xyz")でもう一方が一文字(q)で「if(strcmp(p,q)==0)」のときは何を比較するのでしょうか。  宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

strcmpとは、文字列1と文字列2の大小を比較します。文字列の長さの比較ではありりません。また、文字列と文字は違います。文字列は、必ず終端にNULL文字('\0'と書きます。数値の0の値をとります)が有る状態のことをいいます。文字列とは、"abc"などですが、'x'は1文字ですので、文字列ではありません。したがって、strcmp("abc",'x')は、そもそもコンパイルエラーとなり、実行できません。(文字列と文字列の比較しか出来ません) ここから、本題。 >  前の文字が一文字(h)で後ろ文字が複数(abc)、 >  前の文字が複数(hjk)で後ろの文字が一文字(p)、 >  両方が複数の文字列(lmnとstu) "h"と"abc"の比較と解釈します。'h'と"abc"の比較は、前述しましたようにコンパイルエラーになります。 "h"とは、1文字目がh,2文字目が\0の状態です。 同様に、"abc"は、1文字目がa,2文字目がb,3文字目がc,4文字目が\0の状態です。 strcmp("h","abc")は まず1文字目どうしを比較します。 hとaです。hのほうが大きいので+の値を返して終わりです。 "hjk"と"p"の比較は strcmp("hjk","p")です。 1文字目どうしを比較します。hとpでは、pのほうが大きいので-の値を返して終わりです。 strcmp("lmn","stu") 1文字目のlとsを比較します。sのほうが大きいので、-の値を返して終わりです。 以下、余談。 strcmp("abc","abx") 1文字目が同じで決着つかず。次の文字へ 2文字目が同じで決着つかず。次の文字へ 3文字目でxが大きいので-を返します。 strcmp("abc","abc") 1文字目が同じで決着つかず。次の文字へ 2文字目が同じで決着つかず。次の文字へ 3文字目同じで決着つかず。次の文字へ 次の文字がないので0を返す。(文字列が同じケース) strcmp("abc","abcd") 1文字目が同じで決着つかず。次の文字へ 2文字目が同じで決着つかず。次の文字へ 3文字目同じで決着つかず。次の文字へ 前の文字(左側)の文字は、次が'\0'なので、 値が0になります。dの方が大きいので-を返します。

eiji_0035
質問者

お礼

tatsu99さん、非常に分かりやすい説明ありがとうございました。 理解できました。 今後とも宜しくお願いします。

その他の回答 (6)

回答No.7

> もう少し具体的に教えていただけないでしょうか。 > 全く意味が理解出来ません、宜しくお願いします。 これ以上具体的にと? あなたの目の前に英和辞典があるとします。電子的なものではなくて、紙に印刷された本です。 今、開いているページにはhが載っています。これからabcという単語の意味を調べたいとしたら、どちらにページをめくっていきますか? どちらにページをめくるかは、abcの1文字目であるaと、hを比較して決めませんか? abcが3文字であることは関係ないのではないですか? あなたはなぜか1文字同士だと辞書の順番で、そうでない場合は違う方法だと思い込んでいるようですが、何文字であっても辞書の順番です。文字列の長さで比較するなどとはどこにも書かれていません。 この辞書の順番というのをプログラム的に説明されたのが、No.1の回答です。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

国語辞典を引くときのことを想像してください。 「キーボード」という5文字の言葉と「マウス」という3文字の言葉では、 どちらが前に載っていますか? 「えんぴつ」という4文字の言葉と「シャープペンシル」という8文字の言葉では、 どちらが前に載っていますか? どちらが前に載っているかと、言葉の長さとに、関係がありますか?

回答No.4

> 前の文字が一文字(h)で後ろ文字が複数(abc) あなたがabcを辞書で調べるとき、たまたま開いたページに載っていたのがhだったら、そのページより前を調べますよね。abcが3文字だということが、辞書のhより前のページを調べるか、後のページを調べるかに影響しますか?

eiji_0035
質問者

お礼

m-さん、回答有り難う御座います。 >あなたがabcを辞書で調べるとき、たまたま開いたページに載っていたのがhだったら、そのページより前を調べますよね。 >abcが3文字だということが、辞書のhより前のページを調べるか、後のページを調べるかに影響しますか? もう少し具体的に教えていただけないでしょうか。 全く意味が理解出来ません、宜しくお願いします。

回答No.3

> 文字列の長さは比較の対象ではないのでしょうか 僕の回答をもっぺんよく読め。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

文字列の長さを比べる関数はstrlenです。

回答No.1

双方の0文字目を比較します。勝負がついたら(等しくなければ)比較終了。 勝負がつかなかったら1文字目を比較します。 それでも勝負がつかなかったら2文字目を比較します。 ...以下同文。 この処理の途中でどちらかがタネ切れ(比較すべき文字がなくなった)なら、短い方の負けです。 双方同時にタネ切れなら、最後の文字の比較結果となります。

eiji_0035
質問者

お礼

 epistemeさん、回答有り難う御座います。  >双方の0文字目を比較します。勝負がついたら(等しくなければ)比較終了。 # 比較するのは辞書に出てくる文字の順序を数字化したものだけが対象でしょうか。  文字列の長さは比較の対象ではないのでしょうか。   前の文字が一文字(h)で後ろ文字が複数(abc)、   前の文字が複数(hjk)で後ろの文字が一文字(p)、   両方が複数の文字列(lmnとstu) だったら一体どのように比較していくのでしょうか。  スミマセン、宜しくお願いします。

関連するQ&A

  • PHPのstrcmp関数について

    PHPのstrcmp関数の動きがよくわかりません。 strcmp (PHP 4, PHP 5) strcmp — バイナリセーフな文字列比較 説明 int strcmp ( string $str1 , string $str2 ) この比較は大文字小文字を区別することに注意してください。 パラメータ str1 最初の文字列。 str2 次の文字列。 返り値 str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。 ・・・・・・・・・とマニュアルには上記のようにあります。 聞きたい事!▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 1 このstr1がstr2より大きいとはどういうことでしょうか? 2 実際に動きを確認するためにstrcmp関数を他のPHPのビルトイン関数で実現できないのでしょうか? 私の想像では、この関数にあたえる二つの引数を10進数に変換して、値の大きさを比較するという方法なのですが・・。 たとえば <?php $str01 = "a"; $str02 = "b"; print strcmp($str01,$str02); print "<br />"; //上記の値は-1がでるためこの場合 $aのほうが$bより小さいことになる。 //$aの値の文字aが小さいとは?どういうことか //私の、ぱっと思いついた方法は、以下のような意味? $str01 = bin2hex($str01); print $str01 ; //16進数でaという値を表すと61がでる print "<br />"; $str01 = hexdec($str01); print $str01; //10進数でaという値を表すと97がでる print "<br />"; //上記を同じく$bに行うと $str02 = bin2hex($str02); print $str02 ; //16進数でaという値を表すと62がでる print "<br />"; $str02 = hexdec($str02); print $str02; //10進数でaという値を表すと98がでる print "<br />"; print "<hr />"; /* 結果、$aは$bより 【小さい】という事なのでstrcmpは-1を返したと・・・。 こういう事をかんがえてみました。 そしてこれは、普通に考えれば a => bという順序なので アルファベット順になります。 しかしこのやり方だと */ $str03 = "aaaaaaa"; $str04 = "bb"; //と上記のような文字列があった場合同じく同じ手順で値をだすと $str03 = bin2hex($str03); print $str03 ; //16進数でaという値を表すと61616161616161がでる print "<br />"; $str03 = hexdec($str03); print $str03; //10進数でaという値を表すと27410143614427489がでる print "<br />"; //上記を同じく$bに行うと $str04 = bin2hex($str04); print $str04 ; //16進数でaという値を表すと6262がでる print "<br />"; $str04 = hexdec($str04); print $str04; //10進数でaという値を表すと25186がでる print "<br />"; /*ただ上記の方法だと、$str03と$str04を比較すると$str04の【bb】という値の方が 小さくなり順序的には bb => aaaaaaとなりアルファベット順にするとこができない。 三つ目の質問 3 アルファベット順にソートしたいとき標準のsort関数を使わずに他のPHPの標準関数の組み合わせでアルファベット順に並び替える 関数はつくれないのか? どなたか、ご意見お聞かせください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • if( strcmp( 引数, 引数 )=== 0

    サンプルで、 if( strcmp( 第1引数, 第2引数 ) === 0 ){ て書いてあるコードを見たのですが、 この === 0 には、どういう意味があるのでしょうか? (==0とはどう違うのでしょうか? という意味です) 試しに、型の一致を確認できるのかな? と思いやってみたのですが、 うまくいきませんでした。 $a = "10"; $b = 10; if( strcmp( $a, $b ) === 0 ){ print "2つの文字列は同じです!"; } else { print "2つの文字列は違います"; } strrposの返り値判定に「===」を使うのだったら、 意味は分かるのですが、 それとは意味合いが違うような (strcmpに===を使う意味はないような)気もするのですが…

    • ベストアンサー
    • PHP
  • strcmp関数などでの複数の文字列の比較

    以下の例はランダムなiの値で文字列にアクセスして その文字列がどの文字列であるかを判定しているプログラムです。 char *string[] = {   "aaa",   "bbb",   "ccc", } ; int i = rand() % 3; if ( strcmp( string[ i ], "aaa" ) == 0 ) {   printf("aaaです"); } if ( strcmp( string[ i ], "bbb" ) == 0 ) {   printf("bbbです"); } if ( strcmp( string[ i ], "ccc" ) == 0 ) {   printf("cccです"); } するとこのようにif文の羅列になってしまいます。 (strstr関数を使う場合などでも同じような感じです。) 複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

  • c言語がわかりません

    (1)数学関数(cos)を用いて、10度から50度まで10度刻みのcos値の表を表示するプログラムを作成。 数学関数のヘッダファイル:<math.h> cos関数:cos(ラディアン値) (double型) ラディアン値 r=d*(3.14159/180) (2)文字列の大小比較を行なうstrcmp関数を用いて、入力された2つの文字列の大小比較を行い、結果を表示するプログラムを作成。 strcmp関数形:int strcmp(a,b) a,bは文字列(文字配列) 戻り値:a<bなら負、a=bなら0,a>bなら正

  • toupper関数とstrcmp関数を使った問題

    前回答えてくださった方々へのお礼 ・前回質問した際、質問に答えてくださった方々、皆様のおかげで問題を解く事ができました。本当にありがとうございました。 ↓ここから質問です。 「end」と入力されるまで、キーボードから文字列を読み取るプログラムを作成してください。ただし、大文字と小文字が混ざった「EnD」などでも終了するようにしてください。小文字を大文字に変換する「toupper( )関数」を利用してください。また、文字列の比較には「strcmp( )関数」を利用してください。 という問題を解いているのですが、自分でした結果 #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { char str[10]; ←str[10]は適当に値を決めているだけです int i,ret; int result; do { printf("文字列を入力してください:"); scanf("%s", str); i = 0; while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } result = strcmp("END", str); //文字列の比較 if (result == 0) { break; //ループを抜ける! } } while (1);            // 条件が1の場合は永久ループ return 0; } ここまではできたのですが、どうしても while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } この部分の「?」と書いている部分がわかりませんでした。 わかる方が居られましたらどうか教えてもらえないでしょうか? あと、おかしな部分等がありましたら教えてください。 どうかよろしくお願いします。

  • strcmp

    超C言語初心者です。strcmpを使わずに文字列を比較する文を書いているのですが、途中でわからなくなりました。 宜しければご指摘お願いします。 #include<stdio.h> int main(){ char cp1[100],char2[100]; int i=0; int j=0 printf("1つ目の文字列:\n"); scanf("%s\n",cp1); printf("2つ目の文字列:\n"); scanf("%s\n",cp2); while(cp1[i]=='\0' || cp2[j]=='\0'||cp1[i]==cp2[j]=='\0'){ cp1[i++]; cp2[j++]; } if(cp[i]==cp2[j]=='\0'){ printf("同じ文字数\n); }else if (cp1[i]=='\0'&&cp2[j]!='\0'){ printf("2つ目の方が大きい\n); }else if (cp2[j]=='\0'&&cp1[i]!='\0'){ printf("1つ目の方が大きい\n); } exit(0); } と今書いています。間違いだらけでしょうが、お願いします!!

  • 文字列を比較するプログラム

    キーボードより文字列aと文字列bを入力し、比較する(どちらが辞書並びで先かを表示する)プログラムを作れ。但し、strcmp関数を用いてはならない。 という問題があるんですが文字列の比較のしかたがまったくわかりません。わかりやすく教えていただけるとありがたいです。

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

  • どの関数が良いのか教えてください

    VLOOKUPまたはDGETで試してみましたが、 うまくいきません。 よろしくお願いいたします。 あ  ABCDE  C あ  ABCDE  C ・    ・    ・ ・    ・    ・ ま  EFGHI  R ま  EFGHI  R ・    ・    ・ ・    ・    ・ A、B、Cそれぞれの列には全く同じ値の行が複数ずつあります。 A、B、Cの値の組み合わせは全て同じです。 このデータベースからB列の「ABCDE」ならばC列の「C」を拾って 来たいのですが、うまくいかないのは同じ値の行が複数あるから なのでしょうか。 よろしくお願いいたします。

  • 関数とtextを使ってURLをリンクさせる関数について

    EXCEL2007を使用しています。 A列に必ず9桁の英数字 B列に何文字になるか分からない英数字 C列に=URLを表示させ、クリックすれば、WEBにアクセスするようにしたいです。 HTTP://abcde【A2】dageds【B2】 というURLにしたいのですが、 教えて下さい。 A2とB2以外のURLの部分は常に同じです。 よろしくお願いします。