2016-02-15 3 views
-1

встречаю ошибка «Строка подстрочный из диапазона» при запуске этих кодовОшибка «Строка индекс вне диапазона»

#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

Что делает Вы уверены, что доступ к 'ул [1]' валидно внутри фактических границ ? –

+0

Если я отлаживаю «Step over» в VS без цикла, то при значении «str» VS показывает первую строку, если я делаю это с помощью циклов, но без выражения «if», VS показывает каждую строку после каждого цикла. Я думаю, это нормально, если я добавлю «if» в циклы, но появится ошибка. – user3422857

ответ

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) == "//")) 
+0

Большое вам спасибо. Я новичок в C++, поэтому я пропускаю пустую строку. – user3422857

+1

примечание: поскольку C++ 11 проверка длины на самом деле не нужна; 'Ул [ул.size()] 'определяется как ссылающийся на нулевой ограничитель только для чтения, который хранится где-то, и короткое замыкание предотвратит попытку' str [1] ', если' str [0] 'действительно является нулевым терминатором –

Смежные вопросы