微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

getline() 和输入流的问题

如何解决getline() 和输入流的问题

代码

#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>>ch 应该取 2 并打印 x2x

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

解决方法

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

它可以通过 std::cin.clear() 轻松修复。使用 std::string 存储输入并让它处理长度也是一种替代方法。

相关:

,

在输出 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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。