错误“字符串下标超出范围”

时间:2016-02-15 22:41:25

标签: c++ string

运行这些代码时,我遇到错误“字符串下标超出范围”

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main ()
{
    ifstream in("_start.txt");
    ofstream out("_end.txt");

    string str;
    while (getline(in, str))
    {
        if ((str[0] != '/') && (str[1] != '/'))
            out << str << endl;     
    }

    //getline(in, str);
    //if ((str[0] != '/') && (str[1] != '/'))
        //out << str << endl;
    return 0;
}

文件_start.txt就像这样

//<3403> 「それじゃまるで…俺おまえのライバルみたいじゃんか…」
<3403> 「It's like...we were actually rivals or something...」
<3403> 「Giống như...chúng ta là đối thủ thật sự hay sao ấy...」

//<3404> 井上
<3404> Inoue

//<3405> 「きっとね」
<3405> 「I'm sure we were.」
<3405> 「Tôi tin là thế.」

我的目的是在每行开头检查2个字符,如果忽略“// - 字符”。然后我继续检查每行开头的6个字符,格式相同

<[number with at least 4 characters, so number 1 will be written 0001]>

并且此行的数字大于前一行的数字1.因此,如果该行的数字相等

Add "//-character" at start of previous line

或更大的前一行的编号2,3或4,...(大于1)将被修复。

这是一个漫长的过程,所以我开始使用迷你目的是打开除“// - 字符”行之外的所有行,我遇到了这个错误。如果我没有循环,第一行的一切都很好,但是当我包含循环时,会出现错误。

1 个答案:

答案 0 :(得分:2)

if((str[0] != '/') && (str[1] != '/'))
//                 ^^
//         btw, this should be ||

将在单行/的空行和行上调用未定义行为,而不添加其他字符。
添加此项检查(short-circuit evaluation):

if(str.length() < 2 || (str[0] != '/') || (str[1] != '/'))

将其读作:

  

如果str短于两个字符,我们就知道它在开头不会包含//。否则,请进行检查(仅适用于较长的字符串)。

使用De Morgan's laws,它与:

相同
if(!(str.length() >= 2 && str[0] == '/' && str[1] == '/'))

可能更容易理解。阅读它:

  

首先,检查str是否至少包含两个字符。如果是,请检查前两个是//。如果此条件产生false,则执行以下代码。

也可以使用std::string::substr来实现更短的代码:

if(str.length() < 2 || str.substr(0, 2) != "//")

if(!(str.length() >= 2 && str.substr(0, 2) == "//"))