2016-12-10 9 views
1
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エラーが発生していますか?

+2

*このコードでは文字列の入力が行われません。* - その理由です。文字列が空で、最初の要素にアクセスしようとしています。 – PaulMcKenzie

答えて

0

ラインベース入力ノンラインベース入力です。

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);   
    }  
} 

注意。ユーザーが負の数を入力するとどうなりますか?

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エラーと言います。

関連する問題