Visual C++报string subscript out of range错误 配置文件读取函数问题排查
问题排查结果
错误原因
- 匹配逻辑写反:
if (pos == string::npos)是判断当前行不存在目标关键词的逻辑,你原本要处理存在关键词的行,应该改成if (pos != string::npos)。当前写法会让所有不包含digits的前4行进入处理逻辑,直接触发后续越界。 - 索引变量未重置:
int i = 0和bool a = true定义在遍历行的循环外部,处理完一行后i的值不会复位,处理下一行时i可能已经超出当前行的长度,直接访问line[i]就会触发下标越界报错。 - 循环终止条件错误:你配置文件中等号后面的取值没有空格,是直接到行尾结束,
for (i; line[i] != ' '; i++)这个条件永远不会满足,i会一直累加直到超出字符串长度,触发越界。 - 冗余变量:
bool a没有实际作用,循环内第一次执行就会break,完全多余。
修复后代码
#include <iostream> #include <fstream> #include <string> using namespace std; string read(string value) { ifstream input; string line="", output=""; size_t pos; input.open("pg_options.txt"); if (!input.is_open()) { cout << "pg_options.txt missing."; return "error"; } while (getline(input, line)) { pos = line.find(value); if (pos != string::npos) { // 修正匹配逻辑:只有找到目标关键词才处理 size_t eq_pos = line.find('='); // 直接找等号位置,不需要手动遍历 if (eq_pos != string::npos) { output = line.substr(eq_pos + 1); // 直接取等号后面的所有内容即可 } break; // 找到匹配项就退出循环,不需要继续遍历后面的行 } } input.close(); return output; }
测试效果
调用cout << read("digits")会正常输出10,无报错。
内容的提问来源于stack exchange,提问作者wcyat
相关产品推荐
相关产品推荐

