int main()
{
int t;
cin>>t;
while(t--)
{
string s;
getline(cin,s);
cout<<s.at(0);
}
return 0;
}
このコードを実行しようとしましたが、out_of_rangeエラーが表示されます。このコードは、文字列入力を受け付けていません。なぜout_of_rangeエラーが発生していますか?
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
getline(cin,s);
cout<<s.at(0);
}
return 0;
}
このコードを実行しようとしましたが、out_of_rangeエラーが表示されます。このコードは、文字列入力を受け付けていません。なぜout_of_rangeエラーが発生していますか?
ラインベース入力ノンラインベース入力です。
int main() { int t; cin>>t;
ユーザが「123」を入力し、次いでエンターキー押下すると、入力の「123」の部分が解析され、t
に数123のように終わるが、改行が起因されますEnterキーは入力バッファーに残ります。
これはラインベースではない入力です。改行が検出されるまで
while(t--) { string s; getline(cin,s);
std::getline
機能はすべてを読み込みます。上からの改行がまだ残っているので、改行が発生するすぐにとs
は空のままです。
これは行ベースの入力です。
std::getline
も、それが遭遇した改行を消費しますが、これはもうあなたはあまり役に立ちません。
cout<<s.at(0);
s
は、第一の要素にアクセスするためにサイズ0とat(0)
しようとしています。存在しない要素にアクセスしようとするときstd::out_of_range_error
を投げるにはat
が必要です。
良い解決策は、最上位入力層のラインベースの入力に排他的に切り替えることです。すべてを行として読み込み、必要に応じて個々の行を解析します。文字列を整数に変換するには、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);
}
}
注意。ユーザーが負の数を入力するとどうなりますか?
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エラーと言います。
*このコードでは文字列の入力が行われません。* - その理由です。文字列が空で、最初の要素にアクセスしようとしています。 – PaulMcKenzie