ReadingLab/Discussion-for-Cpp

ex12_24中ignore函数的作用

csbdong opened this issue · 4 comments

代码如下:

#include <iostream>

int main()
{
    // need to tell the size.
    std::cout << "How long do you want the string? ";
    int size{0};
    std::cin >> size;
    char *input = new char[size+1]();
    std::cin.ignore(); //*********************************************//
    std::cout << "input the string: ";
    std::cin.get(input, size+1);
    std::cout << input;
    delete [] input;
    // Test: if longer than the array size, we will lost the characters which are out of range.
}

输入测试数据 5[Enter]sssss 测试无误,但是删去cin.ignore()后,测试发现输入5之后就不再接受输入。

ignore()默认的参数是1,EOF表示清空缓冲区中的一个字符。但是在输入5之后敲击回车原则上是无影响的,因为cin>>size,中的cin>>该操作符是根据后面变量的类型读取数据。输入结束条件 :遇到Enter、Space、Tab键。*对结束符的处理 *:丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) 。

删去cin.ignore()的条件下:
此处输入5后,缓冲区内无残留数据,因此我认为不加cin.ignore()也是可以的,但是实践表明不行,不知道是为什么?

pezy commented

因为cin>>size,中的cin>>该操作符是根据后面变量的类型读取数据。输入结束条件 :遇到Enter、Space、Tab键。*对结束符的处理 *:丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) 。

这个"丢弃原则" 是哪里规定的?

pezy commented

一个测试建议:

std::cin.ignore(); 前面加上一句 char c = std::cin.get(); 看看这个 c 是什么.

而这个 c 便是当前输入缓冲里的最后一个字符了.

@pezy 关于ignore查阅一些技术博客看到的。http://blog.csdn.net/xuexiacm/article/details/8101859

pezy commented

@csbdong 这篇文章纰漏错误比比皆是, 建议以C++标准文档为准。

这里