Оператор индексации массива в векторах - PullRequest
0 голосов
/ 08 января 2012

Я писал код для токенизации строки с разделителями ",".

    void Tokenize(const string& str, vector<string>& tokens, const string& delimeters)
    {
      // Skip delimiters at beginning.
      string::size_type lastPos = str.find_first_not_of(delimiters, 0);
      // Find first "non-delimiter".
      string::size_type pos     = str.find_first_of(delimiters, lastPos);

      while (string::npos != pos || string::npos != lastPos)
      {
         // Found a token, add it to the vector.
         tokens.push_back(str.substr(lastPos, pos - lastPos));
         // Skip delimiters.  Note the "not_of"
         lastPos = str.find_first_not_of(delimiters, pos);
         // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
      }
    }

    int main()
    {
       string str;
       int test_case;
       cin>>test_case;
       while(test_case--)
       {
           vector<string> tokens;
           getline(cin, str);
           Tokenize(str, tokens, ",");
           // Parsing the input string 
           cout<<tokens[0]<<endl;
       }
       return 0;
    }

Выдает ошибку сегментации при работе.Когда я отлаживал его, причиной проблемы была строка

    cout<<tokens[0]<<endl 

. Я не могу понять почему, потому что на cplusplus.com он использует операторы [] для доступа к значениям векторов

Ответы [ 2 ]

1 голос
/ 08 января 2012
cin>>test_case; // this leaves a newline in the input buffer
while(test_case--)
{
    vector<string> tokens;
    getline(cin, str); // already found newline
    Tokenize(str, tokens, ",");  // passing empty string

Не глядя на вашу функцию Tokenize, я бы предположил, что пустая строка приводит к пустому вектору, что означает, что при печати tokens[0] этот элемент фактически не существует.Вы должны убедиться, что ваш входной буфер пуст, прежде чем вызывать getline.Вы можете позвонить на cin.ignore() сразу после ввода вашего номера, например.

Вы также можете отказаться от operator>> и использовать только getline.Затем выполните преобразование строки в число вашим любимым методом.

1 голос
/ 08 января 2012

Возможно ли, что чтение с использованием std::getline() не было успешным? В этом случае строка будет пустой и использование оператора индекса будет аварийным. Вы всегда должны проверять, было ли чтение успешным после попытки чтения, например ::10000 *

if (std::getline(std::cin, str)) {
    // process the read string
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...