0

この行:

strcat(query,*it);

(*it文字列へのイテレータ)

このエラーが発生し続けます:

``strcat(char[200], const std::basic_string, std::allocator >&)'' の呼び出しに一致する関数がありません

strcattake in a char*whileは文字列だからだと思い*itます。文字列から に変換してchar*で動作させるにはどうすればよいstrcat()ですか?

試してみましstrcat(query,(*it).c_str())たが、実行時エラーが発生するだけです。

編集:申し訳ありませんが、に変換する必要がありますconst char*

4

9 に答える 9

7

strcat(query,(*it).c_str())動作するはずです。実行時エラーとは何ですか? query呼び出しを行う前に、null で終了していると確信していますか?

于 2008-11-12T10:31:44.580 に答える
2

バッファオーバーフロー?

char   query[200] = {0}; // Make sure this array initialized before
                         // you start concatenating strings onto it.

for (it = vec.begin();it != vec.end();++it)
{
   if ((strlen(query) + it->length() + 1) >= 200)
   {
       logError("Buffer oveflow detected.";
       break;
   }
   strcat(query, it->c_str());
}
于 2008-11-12T11:45:46.473 に答える
2

デバッガーを使用してください、Luke!

(*it).c_str() 確かに、イテレータが有効であり、クエリがヌル終了文字列であると仮定すると、strcat の有効な引数になるはずです。それらのどれが誤った動作をしているかを見つける最も簡単な方法は、その動作を監視し、その値を調べて、実行時にクエリを実行することです。

于 2008-11-12T16:04:56.497 に答える
1

どの実行時エラーが発生するかについて、より具体的にする必要があります。文字列を呼び出すc_str()のが正しい解決策です。境界チェックのないstrcat()他の古典的な C 文字列関数と同様に、あまりにも長い入力を渡さないように注意する必要があります。

于 2008-11-12T10:32:14.687 に答える
1

使用しているバッファの長さが確かな場合strcat(例: 200)、strncat;を使用することをお勧めします。これにより、@Martin が言及したバッファ オーバーフローが除外されます。それ以外の場合は、連結する前に全長をチェックします (これは使用の前提条件です!)

ちなみに、通常、クエリは 200 文字をはるかに超えます。結果のクエリの長​​さが不明な場合は、 のような動的文字列にフォールバックしますstd::string

于 2008-11-12T14:11:53.217 に答える
1

null で終了していないことを除外したためquery、問題は次のいずれかである可能性が高いというコンセンサスがあるようです。

  1. バッファ オーバーフロー - が指しているバッファは、連結するのにquery十分な大きさではありません (*it).c_str()
  2. イテレータitが無効です。これは、次のようないくつかの方法で発生する可能性があります。

    • 適切に初期化されていません。
    • someContainer.end(); の値があります。
    • または、既存の反復子を無効にする何らかの方法でコンテナーが変更されました。

デバッガーで何が起こっているかを判断できるはずです。queryまた、とがどのように定義および使用されているかを示すコードをさらに投稿するとit、ここでも決定的な答えが得られると確信しています (リモート デバッグの場合)。

于 2008-11-12T22:45:29.293 に答える
0

これを試してください(実行時エラーはNULL/無効なポインターが原因であると想定しています):

for (...; it != str.end(); ++it)
...
   if (!it->empty())
   {
      strcat(query, it->c_str());
   }

編集: 申し訳ありませんが、c_str() は一時的に忘れていた NULL を返すことはないため、常に安全です。もちろん、クエリ バッファが連結されたすべての文字列を格納できるほど長くない場合を除きます (または、.end() を超えるイテレータ、ループ中に変更されたコンテナなど、他の問題がある場合を除きます)。

于 2008-11-12T10:34:08.583 に答える
0

*すべての場合に有効な文字列を指していますか? 最後の繰り返しで end() を指している可能性はありますか? または、それが指すコンテナーが変更され、*it が無効になっている可能性があります。

于 2008-11-12T14:41:28.583 に答える
0

アプリケーションがリリース モードの場合は、メッセージ ボックスを配置するか、特定の場所に割り込み 3. (_asm int 3;) を生成して、アプリケーションをトレースします。また、割り込みを入れた場合、exe はデバッグ メッセージをポップアップ表示します。プロセスを Visual Studio にアタッチしてデバッグします。これで墜落の場所がわかるといいですね。

于 2008-11-12T15:58:03.953 に答える