0

ここに私の問題があります: コマンド a[1] を含む配列があり、その後にいくつかのコマンド引数 a[2]、a[3]、...

私がする必要があるのは次のとおりです

  • cmd と引数の組み合わせで構成される文字列を作成します。例:

cmd arg1 arg2 arg3

  • そのコマンド文字列を実行します

これが私がそれを行う方法です(疑似コード):

  1. 各引数の長さを事前に計算し、配列に格納します
  2. 組み合わせを取得する (GNU Scientific Library を使用)
  3. 文字列を割り当てるために必要なサイズをバイト単位で計算します (cmd の長さ + 1 + arg1 の長さ + 1 + argn-1 + 1) (一般に、空白の場合は +1、\0 の場合は末尾に )
  4. strcat を使用して文字列を作成します
  5. コマンド文字列を実行する

まあ、それは機能しますが、意図的にstrcatを使用するのは実際に効率的/正しい方法なのだろうかと思います。

助言がありますか?

4

4 に答える 4

5

いいえ、strcat()呼び出すたびに末尾を見つけるために文字列をステップスルーする必要があるため、使用は効率的ではありません。

持っている場合はそれを使用して一度にすべてを実行snprintf()する(そしてそこに引数を絞り込むことができる)か、直接ポインター操作を使用して自分で実行する方がはるかに優れています。

もちろん、これが実際に問題となるためには、このコマンドを非常に頻繁に実行する必要があります。

于 2010-02-16T11:26:36.913 に答える
2

各コンポーネント文字列の長さを保存した場合はmemcpy、使用する代わりに正しいポインター オフセットを使用して使用するように切り替えることができstrcatます。'\0'連結の作成を大幅に高速化するためにできることは、それほど多くありません。

于 2010-02-16T11:25:17.773 に答える
1

strcat()、および標準ライブラリのすべての文字列操作関数は非効率的です。これは、文字列が C で格納される方法、つまりゼロで終了する方法によるものです。したがって、各関数は各文字を反復して文字列の末尾を見つける必要があります。

とにかく、時期尚早の最適化を行っています。ここでの複数の strcat() 呼び出しは、コマンドの実行と比較して非常に高速に実行されるため、連結方法の効率について心配する必要はありません。

コードの一部を最適化する前に、それがボトルネックであり、最適化によって実際に実行時間が改善されることを示す必要があります。ほとんどの場合、最適化する必要はありません。単純に、費やす時間の価値がありません。

于 2010-02-16T11:32:48.903 に答える
0

私はsprintfでそれを行います。

于 2010-02-16T11:25:51.050 に答える