【问题标题】:issues with getline() and input streamgetline() 和输入流的问题
【发布时间】:2021-08-26 11:06:00
【问题描述】:

代码

#include<iostream>
int main()
{
    char s[20];
    char ch;
    
    std::cin.getline(s,10);
    std::cout<<"x"<<s<<"x"<<"\n";
    
    std::cin>>ch;
    std::cout<<"x"<<ch<<"x";
    
    std::cin>>ch;
    std::cout<<"x"<<ch<<"x";
    
    std::cin>>ch;
    std::cout<<"x"<<ch<<"x";
}

输出 1

bonaparte    // I entered these 9 characters as input
xbonapartex
a            //  input
xax
b            // input
xbx
c            // input
xcx

输出 2

bonaparte2    // I entered these 10 characters as input
xbonapartex
x x
x x
x x

与第一个输出相比,我刚刚输入了一个额外的字母意味着通过键盘bonaparte2 总共输入了 10 个字符。

据我所知,getline 将提取 9 个字符并添加 '\0' 并存储在字符串 s 中。所以流仍然包含字符2\n。所以首先cin&gt;&gt;ch 应该取2 并打印x2x

现在第二个cin&gt;&gt;ch 应该忽略\n,因为它是前导空白字符,但这些都没有发生。程序没有从键盘输入询问。

【问题讨论】:

    标签: c++ stream cin getline


    【解决方案1】:

    std::cin.getline(s,10); 中,由于输入大于提供的stream_sizeistream::getline 将流设置为失败状态,从而阻止进一步的输入。

    使用std::cin.clear() 可以轻松修复它。使用std::string 来存储输入并让它处理长度也是一种选择。

    相关:

    【讨论】:

    • 但这不会发生在cin.get() 对吗?
    【解决方案2】:

    在 Output-2 中,std::cin.getline(s,10); 失败(因为它无法读取完整的行)。然后它将流设置为失败状态,并且所有后续提取也将失败(除非您 clear() 流)。

    if(not std::cin.getline(s, 10)) { // an empty string is considered ok
        if(std::cin.eof()) {
            std::cout << "end of file / input closed\n";
            return 1;
        }
        if(std::cin.bad()) {
            std::cout << "a non-recoverable error has occurred\n";
            return 1;
        }
        // failbit
        std::cout << "Too long string entered\n";
        std::cin.clear();
    }
    

    如果您不希望在读取的前 9 个字符内未找到换行符时将流设置为失败状态,则可以改用以下内容。请注意,它可能仍会设置eofbitfailbit,原因如下:

    if(not std::cin.get(s, 10)) {   // an empty string sets failbit
        if(std::cin.eof()) {
            std::cout << "end of file / input closed\n";
            return 1;
        }
        if(std::cin.bad()) {
            std::cout << "a non-recoverable error has occurred\n";
            return 1;
        }
        // failbit
        std::cout << "No string entered\n";
        std::cin.clear();
    }
    

    【讨论】:

    • 首先谢谢,这不会发生在 cin.get() 对吗?
    • @ForrestGump 不客气。我添加了相关信息。
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2013-05-12
    • 2023-03-20
    相关资源
    最近更新 更多