簡體   English   中英

錯誤“字符串下標超出范圍”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM