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 20:55:06
  • 終了:2009/02/01 22:46:22

ベストアンサー

id:Mook No.4

Mook回答回数1312ベストアンサー獲得回数3912009/02/01 22:23:57

ポイント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

peugeot回答回数131ベストアンサー獲得回数52009/02/01 21:28:49

ポイント20pt

同じと考えてOKです。

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

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

char str[32];

if(str == &str[0])

{

printf("同じ");

}

else

{

printf("違う");

}

id:gbs01

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

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

naka1kazu回答回数236ベストアンサー獲得回数122009/02/01 22:05:53

ポイント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

rsc回答回数4400ベストアンサー獲得回数4042009/02/01 22:05:12

ポイント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

Mook回答回数1312ベストアンサー獲得回数3912009/02/01 22:23:57ここでベストアンサー

ポイント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

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません