我正在尝试检查if
中的某些字段值。 MySQL中的大多数值都是NULL
。
似乎搞砸了一切。
我做
while ((row = mysql_fetch_row(res)) !=NULL){
if(row[1] != "-1"){
rows.push_back(row[0]);
}
}
row[1]
的字段是INT
LENGTH
1
,等于1
,-1
或NULL
。大多数是NULL
,但有些是-1
。我认为 mysql.h
将所有值输出为char*
(至少这是我迄今为止能够让它工作的唯一方式)。
无论如何,奇怪的是,rows
被填满了,但它充满了“没有”。我甚至不确定它是空字符串还是什么。
请帮忙。
非常感谢提前!
我在std::cout
循环中将rows[i]
for
放在前面和后面。它输出了大量的--
s。
如果我std::cout
原始row[0]
,则输出正常。
对于us2012:
std::vector< char* > rows;
while ((row = mysql_fetch_row(res)) !=NULL){
std::cout << "-" << row[0] << "-" << std::endl;
if(row[1] != "-1"){
rows.push_back(row[0]);
}
}
std::cout << "Valids:" << std::endl;
for(int i = 0; i < rows.size(); ++i)
{
std::cout << "id: -" << rows[i] << "-" << std::endl;
}
当我使用它时
if(row[1] && row[1] != "-1")
if
反向运作。
注意:我在int
,while
和cout
以及rows
中增加了invalidRows
。该计数器提供389
,rows.size()
2
和invalidRows.size()
387
。
我会在 为什么 CentOS的。我几乎找不到任何东西,我的主人也没有支持。 没有 答案 一直是 使用cout
之后row[0]
{<1}}看看我是否可以if
cout
row[0]
输出正确数据后,if
if(row[1] != "-1")
。
...forbids comparison between pointer and integer...
提供mysql.h
if(row[1] && std::string(row[1]).compare("-1") != 0)
:
invalidRows
将所有内容都放入row[
gave
]&amp;&amp; if(row[1] && std::string(row[1]).compare("-1") == 0)
what():basic_string :: _ S_construct NULL无效已中止`
std::vector< std::string >
!我的逻辑搞砸了所有C ++崩溃问题。row[x]
可以push
_back
为{{1}}。
答案 0 :(得分:2)
首先要做的事情:您使用的API是C API。这没有什么本质上的错误,但这意味着你必须处理许多似乎不必要的东西,因为 C ++有更好的工具可用于此。如果可能的话,你应该使用像MySQL ++这样的C ++包装器:http://tangentsoft.net/mysql++/(这个建议的所有学分转到下面的评论中的@ Non-Stop Time Travel)
在您的原始代码中,您不是在比较字符串,而是在比较地址。您的条件将row[1]
中存储的内存地址与常量字符串文字"-1"
的内存地址进行比较。您真正想要的是({1}})char *
:C++ Compare char array with string
您还要推回指向strcmp
的指针,这是暂时的,它会在while循环的每次迭代中重新分配!你必须复制这些并存储指向副本的指针。
这是一个非常快速的想法,你如何处理这个问题。虽然不是很好的C ++(事实上,如果它不是为了矢量和cout,它也可能是C.见上面的原因。):
row[0]
一般来说,当你在C ++中处理字符串时,我建议使用#include <string.h>
std::vector<char*> rows;
while ((row = mysql_fetch_row(res)) !=NULL){
if(strcmp(row[1],"-1") != 0){
char * store = new char[strlen(row[0])+1];
strncpy(store ,row[0] ,strlen(row[0])+1);
rows.push_back(store);
}
}
std::cout << "Valids:" << std::endl;
for(int i = 0; i < rows.size(); ++i)
{
std::cout << "id: -" << rows[i] << "-" << std::endl;
}
//clean up
for(int i = 0; i < rows.size(); ++i)
{
delete [] rows[i];
}
和std::string
而不是,但这里有问题 - 如果你的mysql行包含二进制数据,你就不要t已经保证以空值终止的字符串了(请参阅此处的MYSQL_ROW规范:http://dev.mysql.com/doc/refman/5.0/en/c-api-data-structures.html)。正如 Non-Stop Time Travel 在下面的评论中所指出的,{{ 1}}支持内部std::string::compare
,但下面的代码示例不适用于它们。
std::string
)