こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

strcat関数のオーバーフロー回避について

C言語を勉強中の者です。開発環境はWindows7 Visual Studio 2010です。

2つの文字列を入力し、strcat関数を用いて文字列を結合、出力するプログラム
を作成しています。文字列は1つの配列につき最大半角5文字です。
本来であれば、char st1[11];ではなく、char st1[6];
としたかったのですが、char st1[6];とすると、strcat関数を実行した際に
バッファオーバーフローによるエラーが出てしまいます。

この様な時に、もっと合理的なコードの書き方があれば教えていただけないでしょうか。
よろしくお願いします。

#include <stdio.h>
#include <string.h>

void main(void)
{

char st1[11];
char st2[6];

printf("文字列(5文字以内)");
scanf("%s", st1);

printf("文字列(5文字以内)");
scanf("%s", st2);

strcat(st1, st2);

printf("%s", st1);

}

投稿日時 - 2012-03-05 21:56:58

QNo.7344853

暇なときに回答ください

質問者が選んだベストアンサー

C++に移行してstd::stringを使う。
揶揄でもなんでもなく、割と本気で。

Cでやってる以上、その辺の管理は完全に自力でやらなければなりません。
st1とst2の文字列長の合計+1(終端分)だけalloc系で確保してコピーって手はありますが、それが合理的かというと微妙な感じですしねぇ。
まぁ普通は「オーバーフローしないような十分な長さを持たせておく」というのが一番手っ取り早い解法です。

あとそのコードでは5文字の入力制限がかかってないので入力だけでバッファオーバーフローが起こせてしまうのに注意。

投稿日時 - 2012-03-05 22:28:29

お礼

ありがとうございます。
allocというのを使用してみます。
確かに入力チェックをしないとオーバーフローしますね。
気をつけます。

投稿日時 - 2012-03-06 04:40:41

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Wr5

まず……何をしたいのか。
どういう動作を意図しているのか。
を説明願えないでしょうか?

>本来であれば、char st1[11];ではなく、char st1[6];

5+5=5になりますか???
結合したいのであれば、結合先にはそれが格納できるだけの領域が必要ですよね?
5リットルのバケツ2つに入っている水をまとめるためにもう片方のバケツに入れたらあふれるのは当然ですよね?

投稿日時 - 2012-03-05 22:22:07

あなたにオススメの質問