![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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);
}
No.2ベストアンサー
- 回答日時:
C++に移行してstd::stringを使う。
揶揄でもなんでもなく、割と本気で。
Cでやってる以上、その辺の管理は完全に自力でやらなければなりません。
st1とst2の文字列長の合計+1(終端分)だけalloc系で確保してコピーって手はありますが、それが合理的かというと微妙な感じですしねぇ。
まぁ普通は「オーバーフローしないような十分な長さを持たせておく」というのが一番手っ取り早い解法です。
あとそのコードでは5文字の入力制限がかかってないので入力だけでバッファオーバーフローが起こせてしまうのに注意。
ありがとうございます。
allocというのを使用してみます。
確かに入力チェックをしないとオーバーフローしますね。
気をつけます。
No.1
- 回答日時:
まず……何をしたいのか。
どういう動作を意図しているのか。
を説明願えないでしょうか?
>本来であれば、char st1[11];ではなく、char st1[6];
5+5=5になりますか???
結合したいのであれば、結合先にはそれが格納できるだけの領域が必要ですよね?
5リットルのバケツ2つに入っている水をまとめるためにもう片方のバケツに入れたらあふれるのは当然ですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
charと%c , %s の関係について
-
C言語、単語ごとに改行したい
-
単語数のカウントについて
-
fgets関数を使用したときの文字...
-
教えていただけませんか?C言語...
-
fgetsでバッファ残留文字列を無...
-
C言語 文字列の操作
-
sscanfとscanfの違いがよくわか...
-
CStringについて
-
strstrを利用しない文字列検索...
-
C言語です
-
C言語 空白の行(改行のみ)が...
-
ブランクのチェック
-
Cで「大文字、小文字の判定」は...
-
教えて下さい 文字数最大制限2...
-
C言語の勉強しています。すみま...
-
C言語で可変長から固定長に変換...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
fgetsで拾われる改行文字を削除...
-
C言語 空白の行(改行のみ)が...
-
itoaわかりません
-
Cで「大文字、小文字の判定」は...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
小文字のみを数える方法
-
C言語のステップ数をカウントす...
-
C言語でパスワード作成ツール
-
単語数のカウントについて
-
str[j++]の意味
-
fgetsでバッファ残留文字列を無...
-
教えていただけませんか?C言語...
-
エディットボックスに入力され...
おすすめ情報