0

何らかの理由で、string cin.getline (temp.Autor, 20)は無視されます。出力を見てください 。理由を理解するのを手伝ってもらえますか?

struct BOOK {
    char Autor[20]; 
    char Title[50]; 
    short Year; 
    int PageCount;
    double Cost;
};                  

void new_book()
{
    BOOK temp;
    system("cls");
    cout <<"ENTERING NEW BOOK: " << endl <<endl;
    cout <<"Input the author: ";
    cin.getline (temp.Autor, 20);
    cout  <<"Input the title: ";
    cin.getline (temp.Title, 50);
    cout  <<"Input the year of publishing: ";
    cin >>  temp.Year;
    cout  <<"Input the number of pages: ";
    cin >>  temp.PageCount;
    cout  <<"Input the cost: ";
    cin >>  temp.Cost;
    cout << endl;   
    print_book(temp);
    system("pause");
}
4

2 に答える 2

6

「そのような構造を発明したのは私ではありません。そして私はそれを変えることはできません。」.

この構造体を思いついた人は誰でも、悪い悪者です。彼は C++、特にモダン C++ の敵です。彼はコンピュータ サイエンスの博士号を持っていても、悪党であり、C++ の勉強をどこから始めればよいかわかりません。彼は CS の他の概念は得意かもしれませんが、C++ はまったく得意ではありません。C++ はそれほど 悪くないのに、そのようなインストラクターのために、C++ は悪い名前を持っています

ここで構造体に戻ります。彼にこの構造体を見せてください:

struct Book 
{
    std::string Author; 
    std::string Title; 
    short Year; 
    int PageCount;
    double Cost;
}; 

そして、この構造体、特にstd::stringメンバーのどこが悪いのか彼に尋ねてください。char-arrayの代わりにこれを好まない理由について、彼に理由を尋ねてください。raw-char-arrayが よりも優れていると彼が考える理由は?std::string

彼が思いついた理由が何であれ、ただ彼に言ってください:神のために、本物のC ++を学びましょう。

raw-char-arraypointers、またはmemory-managementの学習には何も問題はありません。要点は、これらの概念はコースの最初ではなく、後の段階で教えられるべきだということです。繰り返しますが、最初からではありません。あなたの課題は、それがコースの始まりであることを示しています。そのため、学生は最初に 、その他のコンテナ、および標準ライブラリのアルゴリズムを学習する必要がありstd::stringますstd::vector

学生がこれらを学べば、生の配列、ポインタ、メモリ管理、および地獄のような多くのことなどの詳細がどこから来るのか、それらがどのように実装されるかを進めることができます。これらは問題と慣用的な解決策を伴う高度なトピックであり、最も人気のあるのはメモリ管理をエレガントに解決する RAII です。つまり、学生は決して独りで教えられるべきではなく、それと一緒にRAIIを教えられるべきです。newdelete

前に定義した構造体のメンバーにデータを読み込む方法に戻ります。

Book book;

//assuming each value is on its own line!
if ( !std::getline(std::cin, book.Author) ) 
{
     std::cerr << "Error while reading Author \n";
}
//read data into other members

それが役立つことを願っています。

于 2013-01-08T07:34:46.720 に答える
3

cinスペースが見つかると、関数は読み取りを停止します。getline著者名や書名の読み上げに使用します。

詳細については、この質問をお読みください。

プログラムが無限にループするのはなぜですか?

于 2013-01-08T07:50:06.820 に答える