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);
}
}
||<
>文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?
その理解で問題ありません。
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); }
同じと考えてOKです。
配列の[]を省略すると配列の先頭のアドレスを示す事になります。
たとえば以下のようなコードの場合「同じ」と出力されます。
char str[32];
if(str == &str[0])
{
printf("同じ");
}
else
{
printf("違う");
}
回答ありがとうございます。
良いと思います。
参照
http://www9.plala.or.jp/sgwr-t/lib/strcmp.html
ちなみにポインタとはアドレスの抽象表現と捕えていいので、文字列のアドレスは文字列へのポインタは同義に近いです。
参照
回答ありがとうございます。
>下記のコードの場合、文字列の先頭要素のアドレスを渡しているのではないでしょうか?
そうです。
>文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?
このブログラムの場合は、そうです。
ただ、たとえば、str1の2文字目からの文字列とstr2の3文字目からの文字列と比較したい場合は、strcmp(str1+1,str2+2)となります。このプログラムの場合は、先頭からの文字列同士の比較だから、strcmp(str1+0,str2+0)⇔strcmp(str1,str2)になっています。
回答ありがとうございます。
>文字列へのポインタと文字列の先頭要素のアドレスは同じと考えて良いのでしょうか?
その理解で問題ありません。
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); }
すみません、ご指摘ありがとうございます。==は=の誤りです。
回答ありがとうございます。
すみません、ご指摘ありがとうございます。==は=の誤りです。
回答ありがとうございます。