[英]Error “String subscript out of range”
運行這些代碼時遇到錯誤“字符串下標超出范圍”
#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)將被固定。
這是一個很長的路要走,所以我從迷你打印開始就是打印除“ //-character”開頭的行以外的所有行,並且遇到此錯誤。 如果我不使用循環,則第一行一切都很好,但是當我包含循環時,會出現錯誤。
if((str[0] != '/') && (str[1] != '/'))
// ^^
// btw, this should be ||
將在空行和帶有/
且沒有其他字符的行上調用未定義的行為 。
添加此檢查( 短路評估 ):
if(str.length() < 2 || (str[0] != '/') || (str[1] != '/'))
讀為:
如果
str
少於兩個字符,我們已經知道它開頭不會包含//
。 否則,請進行檢查(僅適用於較長的字符串)。
使用德摩根定律 ,它等於:
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) == "//"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.