
先日から仕事で別の人が作ったソースを見ることになりました。
文字列連結を繰り返す処理でこんなコードが書いてありました。
char str[4096];
for(;;) { /* 具体的な条件などは忘れました */
sprintf(str, "%s%s", str, var1); /* 一応、var1はstrに対して十分小さな文字列。*/
/* 繰り返しが終了するまで溢れることはないのですが */
}
strcatなどを知らない人が作ったのでしょう。
一応、目的は達しているし、動いているみたいだからいいと言えばいいのかもしれないですが、なんか気持ち悪い。
こういうコードで何か問題はないのでしょうか?
No.5
- 回答日時:
このコードがどのような状況で使用されるか不明ですが…
よく使うパターンで言えば
do {
sprintf(path, "%s/%s", path, filename) ;
} while (filenameがディレクトリであるという判定) ;
とかですね。
C89以降に準拠したsprintf()ならほぼ動作すると思われます。
C89以前のsprintf()の場合、第1引数のバッファを直接書き換えているモノがあり、その場合最初にバッファクリアしている可能性があります。
あと、気になる点では…
/* 繰り返しが終了するまで溢れることはないのですが */の保証は一般的に不可能です。
sprintfが作成するstrは環境依存です。
プログラムは単位(たとえば1文字)が何バイトになるかすら想定できません。
(私が知っている文字コードセットでは1文字最大8オクテットというのがあります)
C99であればsnprintf()を使うべきですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# C言語の質問です HTMLでこのようなコードを書いたのですがそれをC言語で同じように書きたいです < 1 2022/08/11 23:38
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
【C#】 あるイベントから別イ...
-
サスペンド(休止やスタンバイ...
-
スロットゲームのプログラミング
-
for文実行中を途中で中断するに...
-
SendMessage中のメッセージ・ル...
-
CreateCompatibleDCを初期化時...
-
VBSで応答不要のメッセージボッ...
-
VB Loopを一時停止し再開あるい...
-
マルチスレッドを実現したい
-
c#でボタンのアクションが終わ...
-
VCでウエイトをミリ秒でかけ...
-
WEB上にボタンが押せない
-
MFCのメニューバーのイベント取得
-
ACCESS側からEXCELの書式を設定...
-
VBA、UserFormを前面に出力して...
-
Macターミナルで実行中のプログ...
-
C言語で、メモリを解放しないで...
-
SendMessageが失敗するときがある
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
ACCESS側からEXCELの書式を設定...
-
メッセージボックスのボタン名変更
-
VBSで応答不要のメッセージボッ...
-
VBA kernel32 の意味
-
Excel VBA で処理中断(DoEvents...
-
VBA、UserFormを前面に出力して...
-
Application.ScreenUpdating=Fa...
-
MFCのワーカースレッドとUIスレ...
-
ASP.NETでのメッセージ画面を出...
-
「キャンセル」ボタン付きの処...
-
シャットダウン時のExcel強制終...
-
【C#】 あるイベントから別イ...
-
ボタンが押された事を検知する...
-
PostMessageの連続送信
-
VBA メッセージボックスを自動...
-
エクセルVBAでクリップボード内...
-
VCでウエイトをミリ秒でかけ...
-
ループを使わずに、特定時間に...
-
VB6 コマンドボタン クリック...
おすすめ情報