为什么抛出out_of_range错误?

时间:2016-12-10 05:42:53

标签: c++ string getline

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用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错误。

答案 1 :(得分:0)

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

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

当用户输入&#34; 123&#34;然后按下回车键,&#34; 123&#34;解析部分输入并以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);          
    }    
}

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

相关问题