向量上的数组下标运算符

时间:2012-01-07 21:08:16

标签: c++ vector

我正在编写一个代码来标记字符串wrt delimeters“,”。

    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 个答案:

答案 0 :(得分:1)

使用std::getline()的读取是否可能无法成功?在这种情况下,字符串将为空,使用下标运算符将崩溃。您应该始终测试读取是否成功尝试阅读之后,例如:

if (std::getline(std::cin, str)) {
    // process the read string
}

答案 1 :(得分:1)

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。然后使用您喜欢的方法进行字符串编号转换。