int main()
{
int t;
cin>>t;
while(t--)
{
string s;
getline(cin,s);
cout<<s.at(0);
}
return 0;
}
我尝试运行此代码,但它说出out_of_range错误。此代码甚至不接受字符串输入。
答案 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);
}
}
请注意,您应该考虑为代码添加更多错误处理。当用户输入负数时会发生什么?