在这段代码中,在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());
}
}
答案 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
}
这对我有用,我的问题也解决了。