这条c ++代码有什么问题吗?

时间:2015-05-19 10:33:14

标签: c++ stdmap

在这段代码中,在while循环的每次迭代中,都会从文件中读取一行。该行类似于:

13,4636137,的 29464742,29464746,995560164

对于以粗体指定的每个数字,在for循环中检查该数字作为std :: map中的键的存在。如果密钥存在,则将值附加到字符串。然后将字符串写入文件。

如果地图中不存在其中一个键,那么对于该行,不应将任何内容写入该文件。 (bool is_points_in_range)

但实际上,在最后一点(for循环之外)不在键列表中的情况下,程序逻辑表现良好。

为什么布尔运算符在for循环中不会改变?

vector<string> res;
ifstream infile;
map<string, string> m;
while(infile.getline(buffer, LINE_BUFFER_LEN))
{
    line=string(buffer);
    res = SplitBySep(line, ",");
    bool is_points_in_range=true;
    string geo_file_line;
    for (int i=2;i<res.size()-1;i++){
        if ( m.find(res[i]) == m.end() ) {
            is_points_in_range=false;
            break;
        } else {
            geo_file_line= geo_file_line.append(m[res[i]]).append("^");
        }   
    }
    if ( m.find(res[res.size()-1]) == m.end() ) {
        is_points_in_range=false;    
    } else {
        geo_file_line= geo_file_line.append(m[res[res.size()-1]]).append("\n");
    }
    if (is_points_in_range){
        fprintf(fp_geo, "%s",geo_file_line.c_str());
    }
}

3 个答案:

答案 0 :(得分:2)

res.size()-1 非常危险。 res.size()是一个无符号类型,当res.size()为0时从中减去一个类型会因为包围而给你一个非常大的无符号整数。

因此,当res未填充时,您的程序基本上是未定义的。

我很惊讶你的编译器没有警告你。你有警告关闭吗?

答案 1 :(得分:0)

看起来像     m.find(res[i]) == m.end() 从来都不是真的。 你确定这张桌子正确吗? res[i]

答案 2 :(得分:0)

最好问一下为什么这个条件语句不能正常工作? 我们知道,为了获得std :: map中存在的密钥,我们可以使用:

if ( m.find("f") == m.end() ) {
    // not found
} else {
    // found
}

this question所述。

但是

map<string, string> m;

这句话效果不好。我没有任何29464742键(我确定),但是当我搜索这个键时,else部分被执行了。此外,当我使用m.count('29464742')时,返回1。 我不知道为什么?

我用这个条件语句纠正了我的代码:

if ( m["f"] == "" ) {
    // not found
} else {
    // found
}

这对我有用,我的问题也解决了。