1
struct car
{
  string name;
  int year;
};    

int main() {
    int noOfCars;
    cout<<"enter no_ of cars : ";    
    cin>>noOfCars;    
    car* cars = new car[noOfCars];    
    for(int i=0;i<noOfCars;i++)
    {
        cout<<"Car #"<<i<<endl;
        cout<<"Name : ";    
        getline(cin,(cars[i].name));  //here is the problem 
        cout<<"\n year : ";    
        cin>>cars[i].year;    
        cout<<endl;
    }
}

strcutの名前への文字列入力として行全体を取得することで何かが失敗しましたが、何も取得せず、直接年に進みます...:S ???

それはcinで動作しますが、私は全体の行を取りたいです!グローバルに定義された文字列では機能しますが、構造体内では機能しません

4

4 に答える 4

3

クリスが言うように、これは何度も説明されてきました。

問題は前の入力呼び出しにあります

cin>>noOfCars;

これは数値を読み取ります。つまり、数字を読み取りますが、改行は読み取りません。改行を入力することもできますが、それはそれが読み取られるという意味ではありません。実際、改行は次に読むとき、つまりあなたのgetline呼び出しまで残されます。したがって、getline車の数を読み取ったときに残っている改行を読み取る最初の呼び出し。

初心者がこれを間違えるのは驚きではありませんが、質問をする前に問題の調査に時間を費やす必要があることを示しています。これは何百回も前に尋ねられ、答えられました。

于 2012-08-27T16:50:05.073 に答える
2

cin.ignore( 1000, '\n' );の後に挿入 しgetlineます。

#include<string>
#include<iostream>
using namespace std;

struct car
{
  string name;
  int year;
};    

int main() {
    int noOfCars;
    cout<<"enter no_ of cars : ";    
    cin>>noOfCars;    
    car* cars = new car[noOfCars];    
    for(int i=0;i<noOfCars;i++)
    {
        cin.clear();


        cout<<"Car #"<<i<<endl;
        cout<<"Name : ";    
        getline(cin,(cars[i].name));  //here is the problem 

     cin.ignore( 1000, '\n' );

        cout<<"\n year : ";    
        cin>>cars[i].year;    
        cout<<endl;

    }
    return 0;
}
于 2012-08-27T17:12:07.667 に答える
0

問題はcin>>noOfCars、Enterキーによって生成された改行が入力キューに残ることです。は単にそのgetline(cin,(cars[i].name))改行文字を読み取り、配列にnull文字列を割り当てますcar[i].name。そして、ループの最後でcin>>cars[i].year同じことを何度も繰り返すので、getline(cin,(cars[i].name))何かを入力できるようになる前に、常に改行文字を読み取っています。

cinこれを修正するには、読み取りnoOfCarsとの後に改行文字を破棄する必要があります。これは、次のように後cars[i].yearを連結することできれいに実行できます。cin.get()cin

cout<<"enter no_ of cars : ";    
(cin>>noOfCars).get();            //here is the solution
car* cars = new car[noOfCars];    
for(int i=0;i<noOfCars;i++)
{
    cout<<"Car #"<<i<<endl;
    cout<<"Name : ";    
    getline(cin,(cars[i].name));  //here is the problem 
    cout<<"\n year : ";    
    (cin>>cars[i].year).get();   //here is the solution 
    cout<<endl;
}
于 2016-05-05T18:25:13.480 に答える
-1

cin.getline(Cars[i].name,streamsize); ストリームサイズが文字列の最大サイズである場合を試してください 。それが最も単純な形だと思います。

于 2012-08-27T16:57:57.717 に答える