if(!buydat.empty()) 验证失败(始终为 true)

if(!buydat.empty()) validation fails (always true)

本文关键字:true 失败 验证 buydat empty if      更新时间:2023-10-16

我有一个始终正确的"如果验证",即使我删除它正在接收的入站数据以确保它是空的,我仍然会在不应该的时候到达我的 cout 语句。

法典:

void buymngr(){
        vector<std::string> buydat;
        vector<std::string> markdat;
        vector<std::string> pricedat;
        buydat = getmyData();
        if(!buydat.empty()){
                cout << "You 'do' have buy string match data!" << endl;
        }

它调用负责获取数据的函数getmyData

获取我的数据:

vector<string> getmyData()
{
        FILE *mydfp = popen("php getMyorders.php", "r");
        if (mydfp == NULL) perror ("Error opening file");
        char mydbuff[BUFSIZ];
        vector<string> vrecords;
        while(fgets(mydbuff, sizeof(mydbuff), mydfp) != NULL){
                size_t n = strlen(mydbuff);
                //clean '' from fgets
                if (n && mydbuff[n - 1] == 'n') mydbuff[n - 1] = '';
                if (mydbuff[0] != '') vrecords.push_back(mydbuff);
        }
        cout << "I got my own data" << endl;
        return vrecords;
}

当代码合法地"true"时,它运行良好并正常执行所有功能。但是当变为 false 时,它仍然验证 true 然后分段错误(gdb 不指向特定行,但错误确实似乎试图处理实际上不存在的有效数据(。

您的if语句检查该b < buydat.size()。 您可以使用以下语句在向量末尾之外进行索引:

if ( buydat[b] == "Buy" ){
    pricedat.push_back(buydat[b+1]);
}

编辑:我所说的"你可以索引......"是什么意思。是"您可能正在索引..."。
这是一个观察,而不是一个建议:您正在向pricedat向量添加buydat[b+1]。 如果您的测试(b == (buydat.size()-1)),您将push_back(buydat[buydat.size()] - 无效。 您发布的代码没有任何测试来确保buydat.size()小于 b+N(无论N是什么 - 我根据您的for循环猜测 7

(

评论太长了,所以跟进作为答案:那么你的问题就出在getMyData(). 考虑:

#include <vector>
#include <string>
std::vector<std::string> getmyData()
{
    std::vector<std::string> vrecords;
    vrecords.push_back("anything.");
    vrecords.push_back("anything 2.");
    // push some more data here so the result -looks- like
    // whatever you expect the output of your PHP to be.
    // also, your original version of this function never closes mydfp
    return vrecords;
}
void buymngr(){
    std::vector<std::string> buydat;
    std::vector<std::string> markdat;
    std::vector<std::string> pricedat;
    buydat = getmyData();
    if(!buydat.empty()){
        std::cout << "You 'do' have buy string match data!" << std::endl;
    }
}
int main()
{
    buymngr();
    return 0;
}

检查getMyorders.php的输出 - 如果输出错误,那么,这就是您的问题。 如果没有,请发布 getMyOrders.php 的输出。