#4
by みけCAT » 6年前
Dixq (管理人) さんが書きました:
まず、全角文字は2バイトですのでmemcmpで比較すべきは2バイトです。
char a[3]="あ";
なら、aの3バイト目には終端記号が入ります。
しかし"あいう"や"あいうえお"や"かきく"との文字列と比較しているのであれば3バイト目は必ず文字データが入るので必ず偽になります。
strncpyするときも2バイトでよいはずです。
aの3バイト目には必ず終端記号が入らなければなりません。
全角文字であっても、2バイトとは限りません。
実行環境が書かれておらず、UTF-8ではひらがなは通常3バイトで表されます。
Toshita さんが書きました:コード:
char a[3];//日本語1文字目のみ代入
mor[256][256];//「あいう」「あいうえお」「かきく」が入っているとする
/*略*/
if( memcmp(a,mor,sizeof(char)*3) ){ //aの中身とmorの文字列の一文字目の比較 同じ場合偽、違う場合真
strncpy(a,mor[count],sizeof(char)*3);//もし文字が違う場合、新しい文字列の一文字目を代入
printf("//a=[%s]//\n",a);
}
出て欲しい出力
//a=あ//
//a=か//
実際の出力
//a=ああいう//
//a=ああいうえお//
//a=かかきくけこ//
となります。
提示された「コード」はそのままではコンパイルが通りません。
以下のようにコードを補ってみましたが、strlen("あ")が2の環境(ローカルWIndows7)、3の環境(Wandbox)ともに再現できませんでした。
► スポイラーを表示
コード:
#include <stdio.h>
#include <string.h>
int main(){
char a[3]="あ";//日本語1文字目のみ代入
char mor[256][256]={"あいう","あいうえお","かきく"};//「あいう」「あいうえお」「かきく」が入っているとする
/*略*/
for(int count=0;count<=2;count++)
if( memcmp(a,mor[count],sizeof(char)*3) ){ //aの中身とmorの文字列の一文字目の比較 同じ場合偽、違う場合真
strncpy(a,mor[count],sizeof(char)*3);//もし文字が違う場合、新しい文字列の一文字目を代入
printf("//a=[%s]//\n",a);
}
printf("%d\n",(int)strlen("あ"));
}
未定義動作(終端文字の分のメモリが無いことによる配列の範囲外へのアクセス)の疑いがあります。
[quote="Dixq (管理人)" id=3,19704,148476]
まず、全角文字は2バイトですのでmemcmpで比較すべきは2バイトです。
char a[3]="あ";
なら、aの3バイト目には終端記号が入ります。
しかし"あいう"や"あいうえお"や"かきく"との文字列と比較しているのであれば3バイト目は必ず文字データが入るので必ず偽になります。
strncpyするときも2バイトでよいはずです。
aの3バイト目には必ず終端記号が入らなければなりません。
[/quote]
全角文字であっても、2バイトとは限りません。
実行環境が書かれておらず、UTF-8ではひらがなは通常3バイトで表されます。
[quote="Toshita" id=3,19704,148475][code]
char a[3];//日本語1文字目のみ代入
mor[256][256];//「あいう」「あいうえお」「かきく」が入っているとする
/*略*/
if( memcmp(a,mor,sizeof(char)*3) ){ //aの中身とmorの文字列の一文字目の比較 同じ場合偽、違う場合真
strncpy(a,mor[count],sizeof(char)*3);//もし文字が違う場合、新しい文字列の一文字目を代入
printf("//a=[%s]//\n",a);
}
[/code]
出て欲しい出力
//a=あ//
//a=か//
実際の出力
//a=ああいう//
//a=ああいうえお//
//a=かかきくけこ//
となります。[/quote]
提示された「コード」はそのままではコンパイルが通りません。
以下のようにコードを補ってみましたが、strlen("あ")が2の環境(ローカルWIndows7)、3の環境(Wandbox)ともに再現できませんでした。
[spoil][code]
#include <stdio.h>
#include <string.h>
int main(){
char a[3]="あ";//日本語1文字目のみ代入
char mor[256][256]={"あいう","あいうえお","かきく"};//「あいう」「あいうえお」「かきく」が入っているとする
/*略*/
for(int count=0;count<=2;count++)
if( memcmp(a,mor[count],sizeof(char)*3) ){ //aの中身とmorの文字列の一文字目の比較 同じ場合偽、違う場合真
strncpy(a,mor[count],sizeof(char)*3);//もし文字が違う場合、新しい文字列の一文字目を代入
printf("//a=[%s]//\n",a);
}
printf("%d\n",(int)strlen("あ"));
}
[/code][/spoil]
未定義動作(終端文字の分のメモリが無いことによる配列の範囲外へのアクセス)の疑いがあります。