2017-07-09 8 views
0

私はC++の初心者であり、区切られた入力を実験しようとしています。私は、次のコードを使用して区切られたデータを取得し、それを分離します。区切られた入力を>>演算子を使って変数に区切ってください

#include <iostream> 
#include <string> 

int main() 
{ 
    int n1,n2,n3; char data,c; 
    while (std::cin >> data >> c >> n1 >> c >> n2 >> c >> n3 && c == ','){ 
     std::cout << "Entered loop" << "\n"; 
     std::cout << "Value:" << data << "\n"; 
     std::cout << "Value:" << n1 << "\n"; 
     std::cout << "Value:" << n2 << "\n"; 
     std::cout << "Value:" << n3 << "\n"; 
     std::cout << std::endl; 
     } 
} 

ここで入力のようなものです:私はそうのようなのstd ::文字列データと文字データを交換する場合はA、1,2,3 しかし:

#include <iostream> 
#include <string> 

int main() 
{ 
    int n1,n2,n3; std::string data; char c; 
    while (std::cin >> data >> c >> n1 >> c >> n2 >> c >> n3 && c == ','){ 
     std::cout << "Entered loop" << "\n"; 
     std::cout << "Value:" << data << "\n"; 
     std::cout << "Value:" << n1 << "\n"; 
     std::cout << "Value:" << n2 << "\n"; 
     std::cout << "Value:" << n3 << "\n"; 
     std::cout << std::endl; 
     } 
} 

のような入力では:ABCD、 1,2,3 デバッグ中の「入力されたループ」出力は、whileループ条件が決して満たされないことを意味します。

charを文字列に置き換えると、何が問題になるのですか。

答えて

0

charは、1文字の1シンボルです。それ以上はない。

std::stringは、を0以上にすることができます。文字です。

operator>>が変数charを使用すると、1つの文字のみが読み取られます。

operator>>が変数std::stringを使用する場合は、最初に空白文字を無視し、空白文字が読み取られるまで文字を読み取ります。

編集1:テキストデータを読み込むときstd::getlinestd::string
std::stringstd::getlineを使用して、終端文字を指定することを好みます。例えば

std::getline(cin, data, ','); 

は上記までstd::cinから読みます「」data変数に「」以外のすべてを配置し、読み込まれます。

+0

文字データをcharデータ[4]で置き換えて、次の空白まで読む問題を解決するべきではありませんか? charデータ[4]で置き換えても、やっていません。区切り文字が気になるまで読み込むgetlineメソッドについて知っています。 – DuringTuring

+0

'演算子>>は配列が4文字であることをどのように知っていますか?私の理解では、関数に渡されると、配列は最初のスロットへのポインタに減衰します。終端文字はどうですか?不具合を避けるために、 'istream :: read'関数を使用して、読み込まれる文字数を制限することができます。別の考え方は、 'std :: getline'を使い、文字列を切り捨てるか、文字列の長さが4だけ​​であることを検証することです。 –

関連する問題