-1

私は C++ が初めてで、大きなプロジェクトで繰り返し変更を加える必要があります。すべての strcpy および strcat メソッドを取得して、それらを sprintf に変換する必要があります。基本的に、変換は次のようになることがわかりました。

strcpy(out,in) to sprintf(out, "%s", in)

strcat(out,in) to do{ int temp = strlen(out); sprintf(out+temp, "%s", in); } while(0)

最初の質問、そのコードは機能しますか?

2 番目の質問です。out 変数と in 変数を数値にする方法は絶対にありません。また、%s の代わりに %d を使用する必要があります。

3 番目の質問です。変更するすべてのコードのメソッドの反復ごとに out 変数と in 変数が異なるため、変更は変数名に柔軟に対応する必要があります。どんな方法がありますか?これはVisualStudio 98プロジェクトです...しかし、私はLinux ubuntuとWindows XPを使用しています。

あなたの時間と提案をありがとう!

ああ、心配しないでください。ファイルのバックアップを作成しました:D

4

2 に答える 2

0

最初の質問、そのコードは機能しますか?

はい、しかしもっと簡単です:

strcat(out, in) -> sprintf(out + strlen(out), in)

2 番目の質問です。out 変数と in 変数を数値にする方法は絶対にありません。また、%s の代わりに %d を使用する必要があります。

いいえ -文字列コンテンツstrcpyでのみ機能します。strcat

out 変数と in 変数は、変更したいすべてのコードのメソッドの反復ごとに異なるため、変更は変数名に対して柔軟でなければなりません。どんな方法がありますか?これはVisualStudio 98プロジェクトです...しかし、私はLinux ubuntuとWindows XPを使用しています。

トリッキーです...正規表現の置換を使用できますが、本当に奇妙なコードでは失敗する可能性があります。プリプロセッサとハッシュ定義を使用することもできますが、インクルード展開、プリプロセッサが通常サイレントに作成するすべての余分なシンボルを無効にする必要があります...これは、プリプロセッサへのコマンドラインスイッチでサポートされている場合とサポートされていない場合があります.

いくつのインスタンスを変更する必要がありますか? 多すぎない場合は、正規表現を試して手動で確認できます....

于 2012-03-29T15:30:25.647 に答える
0

なぜこれをやりたいのか明確ではありません...

しかし、それを見て、最初のものは機能します。2 つ目は do { } while(0) を囲む必要はありません。代わりに {} を使用して、tmp をローカルに保つことができます。しかし、うまくいくようです。または、使用できます

sprintf( out, "%s%s", in ); 

面倒を省きます。

しかし、これらの方法のいずれかに関する私の主な懸念は、バッファ オーバーフローをチェックしていないことです。out が結果を保持するのに十分な大きさでない場合はどうなりますか? もちろん元のコードでも起こり得るので、チェックされているのかもしれません。

于 2012-03-29T15:28:29.117 に答える