发布时间:2023-02-22 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印
/*
 * @Author: DEFT:errornotfound@qq.com  V:NOTFOUND6O6 
 * @Date: 2023-02-22 19:02:35
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2023-02-22 20:19:47
 * @FilePath: \WenkaiC\book.cpp
 * @Description: 
 * 
 * Copyright (c) 2023 by 1zPeasy, All Rights Reserved. 
 */
#include <iostream>
using namespace std;
struct Books{
    string name;
    double price;
};
int main() {
    int n;cin >> n;
    cout << "输入的数量为:" << n << endl;
    struct Books b[n];
    for(int i=0; i < n; i++){
		//char ch;scanf("%c", &ch);
        cin.ignore(1024, '\n');
        getline(cin,b[i].name);
        cin >> b[i].price;
    }
    for(int j=0; j<n; j++){
        cout << b[j].name << endl;
        cout << b[j].price << endl;
    }
    return 0;
}

个人理解

回车换行符:回车键
当我们输入2回车的时候,实际上是先在键盘的键盘缓冲区中缓冲了 2\r\n,然后再发送到缓冲区中。然后第一个cin读取到2,然后再读到一个非数字(\r)后结束,赋值给n,但是此时的回车换行符还在缓冲区中。但是此时在没清空的情况下,又进行getline()函数等待输入,此时我们在键盘中又开始输入"math"回车,发送到缓冲区中。此时缓冲区中有用 \r\nmath,getline()函数读取到\r\n结束,把前面的内容存放到b[0].name,回车符也被读出扔掉;然后继续下一个cin,这个时候cin读取到缓冲区中math,m放double类型的price时,类型不匹配,复制失败,所有b[0].price就是默认值0。然后进行第二次循环__?____。

解决方法

原理:为什么能达到和cin.ignore类型的作用呢?

char ch;scanf("%c", &ch);

或者
原理:cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

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

参考文章

【C/C++】scanf()函数用法详解(缓冲区、格式控制、fflush)
cin.ignore()函数的用法
C++中关于 getline() 读取缓冲区中回车,以及cin 结束符的问题
【令人烦恼困惑的scanf (共5集)】 【精准空降到 15:09】
\r \n 回车换行符详解
getchar scanf 缓冲区 清除回车符