视觉 C++ 字符串下标超出范围
Posted
技术标签:
【中文标题】视觉 C++ 字符串下标超出范围【英文标题】:visual C++ string subscript out of range 【发布时间】:2021-09-04 07:31:04 【问题描述】:我遇到了“字符串下标超出范围”错误。 经过测试,我很确定是因为这个函数,它用于读取文件中的值,但不知道是什么问题:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string read(string value)
ifstream input;
string line="", output="";
size_t pos;
bool a = true;
int i = 0;
input.open("pg_options.txt");
if (!input.is_open())
cout << "pg_options.txt missing.";
return "error";
while (getline(input, line)) //get file lines
pos = line.find(value);
if (pos == string::npos) //if value in line
while (a == true)
if (line[i] == '=') //after "="
i++;
break;
else
i++;
for (i; line[i] != ' '; i++)
output += line[i]; //put value to output
input.close();
return output;
pg_options.txt:
include_special_characters=true
include_upper_case=true
include_lower_case=true
include_numbers=true
digits=10
cout << read("digits")
返回上述错误。
【问题讨论】:
if (pos == string::npos)
。您的意思是:if (pos != string::npos)
吗?前者检查是否在line
中找不到value
,而后者检查是否在line
中找到value
。
最好将minimal reproducible example 放在一起。我注意到的一件事是这一行的注释:if (pos == string::npos) //if value in line
与代码完全相反。也许您打算在那里使用!=
? for (i; line[i] != ' '; i++)
也很奇怪。你不需要第一个i
,它什么都不做,而且你的字符串中似乎没有空格,所以这肯定会超过字符串的末尾。我建议你在调试器中运行它,当你遇到错误时,向上调用堆栈查找你的代码,看看哪里出错了。
a
在内部 while
循环中不会改变,所以如果你进入这个循环一次,你将永远留在循环中,除非你遇到 =
(或者直到程序崩溃您遇到的错误)。顺便说一句:我建议制作 value
const 甚至可能是一个参考;不小心修改它会导致意外行为并使其成为 const ref 意味着在某些情况下,您可以防止不必要的数组副本支持字符串...
【参考方案1】:
感谢您的 cmets。我通过编辑for
循环解决了这个问题:
string read(string value)
ifstream input;
int olength;
string line = "", output = "";
size_t pos;
bool a = true;
int i = 0;
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)
while (a == true)
if (line[i] == '=')
i++;
break;
else
i++;
olength = line.length() - value.length() - 1;
for (int i2 = 0; i2 < olength; i2++)
output += line[i];
i++;
input.close();
return output;
【讨论】:
以上是关于视觉 C++ 字符串下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章