C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 文字列の連結について


(過去ログ 55 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■30844 / inTopicNo.1)  文字列の連結について
  
□投稿者/ 凪 (1回)-(2009/01/08(Thu) 10:57:06)

分類:[C/C++] 

WinXP
VC++2003

初心者でVCを勉強中です。

文字列の扱いについていくつか質問させてください。

【質問1】
ポインタの文字列同士はどのようにしたら連結できますか?

例:
char* a = "ABCDEFG";
char* b = "HIJKLMN";

自分としてはaを定義した後でaの文字数を取得し、その文字数分のchar変数を用意。
それをbと連結するイメージなのですが、もっと簡単な方法はあるのでしょうか?

char* a = "ABCDEFG";
char c[strlen(a)] = a;

strcat(c,b);

【質問2】
strcatで文字数がオーバーしてもちゃんと表示されます。
このオーバーした部分って領域確保していないのにどこに保持されるのでしょうか?
例:
char a[3] = "abc";
char *b = "def";

strcat(a,b);

結果:abcdef ← 本来3バイトしか確保していないのでわ?

以上、宜しくお願いします。

引用返信 編集キー/
■30845 / inTopicNo.2)  Re[1]: 文字列の連結について
□投稿者/ aetos (67回)-(2009/01/08(Thu) 11:05:50)
No30844 (凪 さん) に返信
> 【質問1】
> ポインタの文字列同士はどのようにしたら連結できますか?
>
> 例:
> char* a = "ABCDEFG";
> char* b = "HIJKLMN";

ポインタじゃなくて配列なら分かるんですか?

char a[ 8 ] = "abcdefg";
char b[ 8 ] = "hijklmn";

を連結して "abcdefghijklmn" を作りなさい、には答えられますか?

> char* a = "ABCDEFG";

この行はコンパイルできません。
C99 でなければ、配列の要素数はコンパイル時に決まっている必要があります。
また、配列にポインタを代入することもできません。
> char c[strlen(a)] = a;

これも危険です。
仮に上のコードがコンパイルできたとして、c は何文字確保していますか? それに対して結果は何文字ですか?
> strcat(c,b);

> 【質問2】
> strcatで文字数がオーバーしてもちゃんと表示されます。
> このオーバーした部分って領域確保していないのにどこに保持されるのでしょうか?
> 例:
> char a[3] = "abc";
> char *b = "def";
>
> strcat(a,b);
>
> 結果:abcdef ← 本来3バイトしか確保していないのでわ?

表示されるのはたまたまで、これは深刻なバグと言っていいものです。「バッファオーバーフロー」というやつです。
気を利かせて 6 バイト分誰かが確保してくれているわけではなく、別のデータが入るはずだった領域を無理やり占拠しているだけです。
絶対にやめましょう。
引用返信 編集キー/
■30846 / inTopicNo.3)  Re[1]: 文字列の連結について
□投稿者/ επιστημη (1488回)-(2009/01/08(Thu) 11:05:58)
επιστημη さんの Web サイト
> 【質問1】
> ポインタの文字列同士はどのようにしたら連結できますか?
>
> 例:
> char* a = "ABCDEFG";
> char* b = "HIJKLMN";

char* c = new char[strlen(a)+strlen(b)+1];
strcpy(c,a);
strcat(c,b);
# 使用後に必ず delete[] c;

> もっと簡単な方法はあるのでしょうか?

std::string a = "ABCDEFG";
std::string b = "HIJKLMN";
std::string c = a + b;

引用返信 編集キー/
■30848 / inTopicNo.4)  Re[2]: 文字列の連結について
□投稿者/ 凪 (2回)-(2009/01/08(Thu) 11:46:29)
No30845 (aetos さん) に返信

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

凄く勉強になりました。
エラーにならないからと言って調子に乗ると危険ですね^^;
その点、VBは楽だった気がする…
「エラーにならないなら大丈夫!」みたいな(笑)
まぁ、そんな事も全然ないですが。

お陰様でスッキリして次に進めます。有難うございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -