電子書籍の厳選無料作品が豊富!

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);

}

A 回答 (2件)

C++に移行してstd::stringを使う。


揶揄でもなんでもなく、割と本気で。

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

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

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

お礼日時:2012/03/06 04:40

まず……何をしたいのか。


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

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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!