【问题标题】:Why is it throwing out_of_range error? [duplicate]为什么会抛出 out_of_range 错误? [复制]
【发布时间】:2016-12-10 05:42:52
【问题描述】:
int main()
{       
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        getline(cin,s); 
        cout<<s.at(0);          
    }    
    return 0;
}

我尝试运行此代码,但它显示 out_of_range 错误。此代码甚至不接受字符串输入。

【问题讨论】:

  • 这段代码甚至没有接受字符串输入。 -- 这就是原因。您的字符串为空,您正在尝试访问第一个元素。

标签: c++ string getline


【解决方案1】:

您正在混合基于行的输入和基于非行的输入。

int main()
{       
    int t;
    cin>>t;

当用户输入“123”然后按回车键时,输入的“123”部分会被解析为t中的数字123,但是回车键产生的换行符会保留在输入缓冲区。

这是非基于行的输入。

while(t--) {
    string s;
    getline(cin,s);

std::getline 函数读取所有内容,直到遇到换行符。上面的换行符仍然存在,因此立即遇到了换行符,s 仍然为空。

这是基于行的输入。

std::getline 也会消耗它遇到的换行符,但这对你没有多大帮助:

   cout<<s.at(0);          

s 的大小为 0,at(0) 尝试访问第一个元素。当您尝试访问不存在的元素时,at 需要抛出 std::out_of_range_error


一个好的解决方案是在顶层输入层专门切换到基于行的输入。将所有内容读取为行并根据需要解析各个行。使用std::stoi 将字符串转换为整数。

这是一个例子:

#include <iostream>
#include <string>

int main()
{       
    std::string input;
    std::getline(std::cin, input);
    int t = std::stoi(input);

    while(t--)
    {
        std::string s;
        getline(std::cin, s); 
        std::cout << s.at(0);          
    }    
}

请注意,您应该考虑在代码中添加更多错误处理。当用户输入负数时会发生什么?

【讨论】:

    【解决方案2】:

    您可以使用cin.sync() 函数来清除额外的输入缓冲区。

    如下代码:

    int main()
    {       
        int t;
        cin >> t;
        cin.sync(); // add this line
        while(t--)
        {
            string s;
            getline(cin, s); 
            cout<<s.at(0);          
        }    
        return 0;
    }
    

    使字符串为空并且您尝试访问第一个元素的原始代码。所以它说 out_of_range 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多