运行这些代码时,我遇到错误“字符串下标超出范围”
#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)将被修复。
这是一个漫长的过程,所以我开始使用迷你目的是打开除“// - 字符”行之外的所有行,我遇到了这个错误。如果我没有循环,第一行的一切都很好,但是当我包含循环时,会出现错误。
答案 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) == "//"))