账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    c++中cin读取输入缓冲区的问题
    • 2020-01-01 00:00
    • 10
    49
    0

    测试代码如下:

    cout << "Enter a string :  ";  // "Hello World"
    char str1[5];
    char str2[5];
    cin >> str1;
    cout << "str1 : " << str1;  // "Hello"
    cin >> str2;
    cout << "\nstr2 : " << str2; // "World"

    修改后:

    cout << "Enter a string :  ";  // "Hello World"
    char str1[5];
    char str2[5];
    cin >> str1;    
    cin.get();
    cin >> str2;  
    cout << "str1 : " << str1 << "\nstr2 : " << str2; // str1输出为空,str2 : World

    是什么原因导致str1输出为空???

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 核桃奶 普通会员 1楼

      在C++中,cin(输入流)是一个用于从标准输入(标准输入流,如键盘或标准输出)读取和处理文本的函数。以下是一些常见的问题,当使用cin读取输入缓冲区时,可能会遇到:

      1. cin无法读取全数字符:cin默认在读取一行输入后关闭,这意味着如果用户输入的不是'\n'(换行符)或'\t'(制表符)等换行符,cin将无法正确读取输入的全数字符。为了解决这个问题,可以使用getline()函数。例如:

      cpp std::string input; std::getline(cin, input);

      getline()函数允许你读取一行完整的输入,包括换行符,并将其存储在input字符串中。

      1. 读取无效字符:在某些情况下,用户可能输入了无效字符,例如空白字符(例如空格、制表符或换行符),或者特殊字符(例如大写字母、小写字母、特殊字符等)。cin无法识别这些字符,导致读取失败。为了避免这种情况,你可以使用std::badbit类型来检查输入是否有效。例如:

      cpp std::ifstream file("filename.txt"); std::string input; bool validInput = file.is_open() && file.peek() != EOF; if (validInput) { std::getline(file, input); }

      is_open()函数检查文件是否已打开,peek()函数获取文件头部的第一个字符,如果第一个字符是EOF(文件末尾),则文件已关闭。如果文件有效且不为空,getline()函数将读取文件的输入,并将读取的内容存储在input字符串中。

      1. 文件读取超时:如果文件包含大量数据,可能需要等待足够长的时间才能读取完整个文件。为了避免这种情况,你可以在cin读取的同时使用boost::asio库的io_service对象。以下是一个示例:

      cpp std::string input; io_service io_service; int readCount = 0; while (true) { boost::asio::read(io_service, boost::asio::inbuffer(input), boost::asio::max_buffer_size(input.size())); if (readCount >= input.size()) { break; } std::getline(io_service, input); readCount++; }

      在这个示例中,read()函数从io_service的输入流读取一个最大缓冲大小的输入。如果在读取过程中读取到完整个输入,read()函数将停止,否则它将继续读取直到读取到文件的末尾。

      注意,boost::asio库的io_service类需要在编译时进行引入,可以通过#include <boost/asio``>#include <boost/asio/io_service.hpp>命令进行导入。此外,boost::asio库的io_service对象不能直接在C++代码中使用,而是在asio库的主程序中创建和管理。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部