这一行:
strcat(query,*it);
(其中*it
是字符串的迭代器)
继续给我这个错误:
没有匹配函数来调用``strcat(char [200],const std :: basic_string,std :: allocator>&)`'
我想这是因为strcat
接收char*
而*it
是字符串。
如何将其从字符串转换为char*
以使其与strcat()
一起使用?
我已经尝试了strcat(query,(*it).c_str())
,但这只是给我一个运行时错误。
编辑:抱歉,它应该转换为const char*
答案 0 :(得分:7)
strcat(query,(*it).c_str())
应该有效。什么是运行时错误?在打电话之前,您确定query
是否为空终止?
答案 1 :(得分: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());
}
答案 2 :(得分:2)
使用调试器,Luke!
(* it).c_str()当然应该是strcat的有效参数,假设你的迭代器是有效的,并假设查询是一个以null结尾的字符串,那么应该这样。找出哪些是行为不端的最快方法是观察它是否这样做并检查它的值并在运行时查询。
答案 3 :(得分:1)
您需要更具体地了解您获得的运行时错误。在字符串上调用c_str()
应该是正确的解决方案。与strcat()
和其他没有边界检查的经典C字符串函数一样,您必须注意不要将输入传递太长时间。
答案 4 :(得分:1)
如果你确定缓冲区的长度是strcat
,那么最好使用strncat
;这将排除@Martin提到的缓冲区溢出。其他人在连接之前检查总长度(this is a precondition for its use!)
顺便说一句,查询通常会超过200个字符。如果您不确定生成的查询的长度,请返回动态字符串,例如std::string
。
答案 5 :(得分:1)
由于您已排除query
未终止,因此似乎共识是该问题可能是以下之一:
query
指向的缓冲区是
不够大
(*it).c_str()
连接到它迭代器it
无效。这可以通过多种方式实现,包括:
您应该能够确定调试器发生了什么。此外,我确定如果您发布更多代码,显示如何定义和使用query
和it
,您也会在这里得到明确的答案(远程调试的方式如何)。 / p>
答案 6 :(得分:0)
试试这个(我假设运行时错误是由于NULL /无效指针):
for (...; it != str.end(); ++it)
...
if (!it->empty())
{
strcat(query, it->c_str());
}
编辑:抱歉,c_str()永远不会返回NULL,我暂时忘记了,所以它总是安全的。除非查询缓冲区不够长,当然不能包含所有连接的字符串(或者还有一些其他问题,比如.end()之外的迭代器,循环期间修改的容器或类似的东西)。 p>
答案 7 :(得分:0)
在所有情况下它是否指向有效字符串?它可以指向最后一次迭代中的end()吗?或者可能是它指向的容器被修改,使其无效。
答案 8 :(得分:0)
如果应用程序处于发布模式,请通过放置消息框或在特定位置生成中断3(_asm int 3;)来跟踪应用程序。如果你把中断放在exe上,它会弹出调试信息。将该过程附加到Visual Studio以进行调试。 希望通过这种方式我们可以知道崩溃的地方。