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++ 的敌人,尤其是 Modern 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-arraystd::string

无论他想出什么理由,只要告诉他:看在上帝的份上,学习真正的 C++。

学习raw-char-arraypointersmemory-management没有任何问题。关键是这些概念应该在课程的后期教授,而不是在开始时教授。我重复不是在开始。你的作业确实表明这是课程的开始。所以在开始的时候,应该教给学生std::stringstd::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 回答