人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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);
}


}

||<

●質問者: gbs01
●カテゴリ:コンピュータ 趣味・スポーツ
✍キーワード:Char C言語 アドレス エラー コード
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● peugeot
●20ポイント

同じと考えてOKです。

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

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

char str[32];

if(str == &str[0])

{

printf("同じ");

}

else

{

printf("違う");

}

◎質問者からの返答

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


2 ● naka1kazu
●20ポイント

良いと思います。

参照

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

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

参照

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

◎質問者からの返答

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


3 ● rsc
●20ポイント

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

そうです。

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

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

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

◎質問者からの返答

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


4 ● Mook
●30ポイント ベストアンサー

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

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


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);
}
◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ