视觉 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 &lt;&lt; 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++ 字符串下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

C++检查和修改字符串/字符串下标超出范围

向量下标超出范围 C++ 合并排序

c++和opencv中的向量下标超出范围错误

C++ 调试断言失败。向量下标超出范围

向量下标超出范围opencv c++

向量下标超出范围错误 - C++ Vectors & Open CV