環境 VC2005 Win32 WindowsXP SP2
宜しくお願いいたします。
6文字格納されている文字列A と、
6文字以上格納されている文字列B があるとします。
文字列Bの先頭(1文字目)から6文字目までが 文字列Aと
まったく一緒かどうか調べたいのです。
下のソースコードではコンパイルは通るのですが、
実行と同時に強制終了します。
強制終了する理由がよくわかりません。
解決策、または代案などがありましたら、ご教授ください。。。。
#include <stdio.h>
#include <string.h>
int main(){
char tokun[] = rarara; // 文字列A
char Buf[] = rararaPrograming; // 文字列B
// Bufの先頭6文字が rarara ならばOKを表示する
if( strcmp((const char *)tokun[0], (const char *)Buf[0]) == 0 &&
strcmp((const char *)tokun[1], (const char *)Buf[1]) == 0 &&
strcmp((const char *)tokun[2], (const char *)Buf[2]) == 0 &&
strcmp((const char *)tokun[3], (const char *)Buf[3]) == 0 &&
strcmp((const char *)tokun[4], (const char *)Buf[4]) == 0 &&
strcmp((const char *)tokun[5], (const char *)Buf[5]) == 0 )
{
printf(OK);
}
return 0;
}
> 強制終了する理由がよくわかりません。
引数が不正だからです。
strcmp は「文字列と文字列を比較する関数」です。それを今回は「文字と文字の比較」
に使おうとしています。
そして、強引にキャストを行うことにより、「1文字の文字コード」を「文字列のアド
レス」と解釈させようとしていますが、そんなアドレスは不正なので、強制終了されま
す。
strncmp を使ってください。
文字をアドレス変換してるのでアクセスエラーだとおもいます
引数を(const char *)&tokun[0]にします
ふつうなら文字数調べてstrncmp をするかまたは
文字数をカットして、strcmpしたらよいかと
Buf[6] = (char)'\0';
if(!strcmp(tokun,Buf)){
printf(OK);
}
>> シャノンさま Sugiさま
なるほど・・・大変よくわかりました。
お2人の意見を踏まえてプログラムを組んで見たところ、
うまく行きました。
どうもありがとうございました。