0

这一行:

strcat(query,*it);

*it字符串的迭代器在哪里)

一直给我这个错误:

没有匹配函数调用 ``strcat(char[200], const std::basic_string, std::allocator >&)`'

我想这是因为strcattake in a char*while*it是一个字符串。如何将其从字符串转换为 achar*以使其使用strcat()

我已经尝试过strcat(query,(*it).c_str()),但这只会给我一个运行时错误。

编辑:对不起,它应该转换为const char*

4

9 回答 9

7

strcat(query,(*it).c_str())应该管用。什么是运行时错误?您确定query在拨打电话之前它是空终止的吗?

于 2008-11-12T10:31:44.580 回答
2

使用调试器,卢克!

(*it).c_str() 确实应该是 strcat 的有效参数,假设您的迭代器是有效的,并且假设查询是一个以 null 结尾的字符串,那么应该这样。找出其中哪些行为不端的最快方法是观察它并检查它的值并在运行时查询。

于 2008-11-12T16:04:56.497 回答
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 回答
1

当您确定要插入的缓冲区的长度strcat(例如 200)时,最好使用strncat; 这将排除@Martin 提到的缓冲区溢出。否则在连接之前检查总长度(这是使用它的先决条件!)

顺便说一句,查询通常会超过 200 个字符。如果您不确定结果查询的长度,请使用动态字符串,例如std::string.

于 2008-11-12T14:11:53.217 回答
1

您需要更具体地了解您得到的运行时错误。调用c_str()字符串应该是正确的解决方案。与strcat()其他没有边界检查的经典 C 字符串函数一样,您必须小心不要将输入传递的时间过长。

于 2008-11-12T10:32:14.687 回答
1

由于您已经排除了query不是空终止的,因此似乎共识是问题很可能是以下问题之一:

  1. 缓冲区溢出 - 指向的缓冲区query不够大,无法 (*it).c_str()连接到它
  2. 迭代器 ,it无效。这可以通过多种方式发生,包括:

    • 未正确初始化;
    • 具有 someContainer.end() 的值;
    • 或者容器已以某种方式进行了修改,导致现有迭代器无效

您应该能够确定调试器发生了什么。另外,我敢肯定,如果您发布更多代码,显示如何定义queryit使用,您也会在这里得到明确的答案(远程调试如何)。

于 2008-11-12T22:45:29.293 回答
0

*it 在所有情况下都指向一个有效的字符串吗?它会在最后一次迭代中指向 end() 吗?或者可能是它指向的容器被修改,使 *it 无效。

于 2008-11-12T14:41:28.583 回答
0

如果应用程序处于释放模式,则通过在特定位置放置消息框或生成中断 3. (_asm int 3;) 来跟踪应用程序。如果你设置了中断,它的 exe 会弹出一个调试信息。将进程附加到 Visual Studio 以对其进行调试。希望通过这种方式我们可以知道崩溃的地方。

于 2008-11-12T15:58:03.953 回答
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 回答