C言語初心者です。strcmpについて教えていただけないでしょうか?

strcmpは文字列へのポインタを引数として渡すのですが、
下記のコードの場合、文字列の先頭要素のアドレスを渡しているのではないでしょうか?
このコードはエラー無く動きます。
文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?

>|c|

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

int main()
{
char str1[32], str2[32];

int cmp;

printf("str1を入力してください");
scanf("%s", str1);
printf("str2を入力してください");
scanf("%s", str2);

cmp == strcmp(str1, str2); //strcmpには文字列へのポインタを引数として与える、でもこれは文字列のアドレス?
//文字列のアドレスと、文字列へのポインタは同じなのかな?
if (cmp < 0)
{
printf("%sは、%sより前にあります。¥n", str1, str2);
}

else if ( cmp > 0 )
{
printf("%sは、%sよりも後ろにあります¥n", str1, str2);
}

else
{
printf("%sと%sは、同じ文字列です。¥n", str1, str2);
}


}

||<

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/02/01 22:46:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.4

回答回数1314ベストアンサー獲得回数393

ポイント30pt

>文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?

その理解で問題ありません。


C言語での文字列は、あるアドレスから連続した文字データで'\0'によって終端するデータです。


蛇足ですが、

cmp == strcmp(str1, str2);

cmp = strcmp(str1, str2);

の誤りでしょうか。


strcmp はアドレスの前後を見ているのではなく、文字の中身を比較しています。

言語Cやネットで探せば、実装例が書いてあると思いますが、中で何をしているかを

見てみるとよいかと思います。

http://www.bohyoh.com/CandCPP/C/Library/strcmp.html

/*--- strcmpの実現例 ---*/
int strcmp(const char *s1, const char *s2)
{
    while (n && *s1 && *s2) {
        if (*s1 != *s2)         /* 等しくない */
            return ((unsigned char)*s1 - (unsigned char)*s2);
        s1++;
        s2++;
        n--;
    }
    if (!n)  return (0);
    if (*s1) return (1);
    return (-1);
}
id:gbs01

すみません、ご指摘ありがとうございます。==は=の誤りです。

回答ありがとうございます。

2009/02/01 22:44:37

その他の回答3件)

id:peugeot No.1

回答回数131ベストアンサー獲得回数5

ポイント20pt

同じと考えてOKです。

配列の[]を省略すると配列の先頭のアドレスを示す事になります。

たとえば以下のようなコードの場合「同じ」と出力されます。

char str[32];

if(str == &str[0])

{

printf("同じ");

}

else

{

printf("違う");

}

id:gbs01

回答ありがとうございます。

2009/02/01 22:45:23
id:naka1kazu No.2

回答回数236ベストアンサー獲得回数12

ポイント20pt

良いと思います。

参照

http://www9.plala.or.jp/sgwr-t/lib/strcmp.html

ちなみにポインタとはアドレスの抽象表現と捕えていいので、文字列のアドレスは文字列へのポインタは同義に近いです。

参照

http://homepage3.nifty.com/mmgames/c_guide/15-04.html

id:gbs01

回答ありがとうございます。

2009/02/01 22:45:12
id:rsc96074 No.3

回答回数4503ベストアンサー獲得回数437

ポイント20pt

 >下記のコードの場合、文字列の先頭要素のアドレスを渡しているのではないでしょうか?

 そうです。

>文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?

 このブログラムの場合は、そうです。

 ただ、たとえば、str1の2文字目からの文字列とstr2の3文字目からの文字列と比較したい場合は、strcmp(str1+1,str2+2)となります。このプログラムの場合は、先頭からの文字列同士の比較だから、strcmp(str1+0,str2+0)⇔strcmp(str1,str2)になっています。

id:gbs01

回答ありがとうございます。

2009/02/01 22:45:01
id:Mook No.4

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント30pt

>文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?

その理解で問題ありません。


C言語での文字列は、あるアドレスから連続した文字データで'\0'によって終端するデータです。


蛇足ですが、

cmp == strcmp(str1, str2);

cmp = strcmp(str1, str2);

の誤りでしょうか。


strcmp はアドレスの前後を見ているのではなく、文字の中身を比較しています。

言語Cやネットで探せば、実装例が書いてあると思いますが、中で何をしているかを

見てみるとよいかと思います。

http://www.bohyoh.com/CandCPP/C/Library/strcmp.html

/*--- strcmpの実現例 ---*/
int strcmp(const char *s1, const char *s2)
{
    while (n && *s1 && *s2) {
        if (*s1 != *s2)         /* 等しくない */
            return ((unsigned char)*s1 - (unsigned char)*s2);
        s1++;
        s2++;
        n--;
    }
    if (!n)  return (0);
    if (*s1) return (1);
    return (-1);
}
id:gbs01

すみません、ご指摘ありがとうございます。==は=の誤りです。

回答ありがとうございます。

2009/02/01 22:44:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません