昨非 发表于 2021-1-17 10:52:33

关于getline函数对字符串的处理(c++)

本帖最后由 昨非 于 2021-1-28 21:55 编辑

        题目要求是:比较string类的输入运算符和getline函数对带有空白字符的字符串的处理差异
        测试输入为(前中后都有空格):
   Welcome to c++ family!

        参考代码如下:
/*
        两种字符串读取的方式对空白字符处理的差异:
                标准输入忽略开头的所有空白,从第一个字符读到下一个空白
                getline从开头读到下一个换行符(换行符被读入但不存储在字符串中)
*/

#include<iostream>
#include<string>
using namespace std;

int main()
{
        string word, line;
        cout << "请选择读取字符串的方式:1 表示逐词读取,2表示整行读取" << endl;
        char ch;   //输入的选择
        cin >> ch;
        if (ch == '1')
        {
                cout << "请输入字符串:   Welcome to c++ family!   " << endl;
                cin >> word;
                cout << "系统读取的有效字符串是:" << endl;
                cout << word << endl;
                return 0;
        }
        //清空输入缓冲区
        cin.clear();
        cin.sync();//清空流

        if (ch == '2')
        {
                cout << "请输入字符串:   Welcome to c++ family!   " << endl;
                getline(cin, line);
                cout<< "系统读取的有效字符串是:" << endl;
                cout << line << endl;
                return 0;
        }
        cout << "您得输入有误!";
        return -1;
}

遇到的问题:
        在输入2并回车测试getline函数部分的时候,出现直接跳出的情况,输出结果为空字符串
请选择读取字符串的方式:1 表示逐词读取,2表示整行读取
2
请输入字符串:   Welcome to c++ family!
系统读取的有效字符串是:

        按照我的理解,getline函数直到遇到换行符才会终止从输入流中读取数据,
        唯一可能造成这种情况的是2之后的回车,但在getline函数执行前就有
        //清空输入缓冲区
        cin.clear();
        cin.sync();//清空流这样清空输入流缓冲区的操作了啊

        是否是因为vs2019的环境特殊或者是c++标准不同抑或是其他我没有注意到的细节原因造成的问题

昨非 发表于 2021-1-18 22:10:02

问题没有时间限制的,什么时候看到都可以来回答,恭候指教哈{:10_297:}

昨非 发表于 2021-1-17 20:04:06

自顶一下,有无老哥解惑{:10_245:}

心驰神往 发表于 2021-1-19 10:17:58

顶一下

心驰神往 发表于 2021-1-19 10:24:13

我用DEV运行正常

昨非 发表于 2021-1-19 11:46:41

心驰神往 发表于 2021-1-19 10:24
我用DEV运行正常

是VS的问题吗

心驰神往 发表于 2021-1-19 17:55:35

昨非 发表于 2021-1-19 11:46
是VS的问题吗

不知道,没用过VS。要不你用DEV试试

昨非 发表于 2021-1-19 17:58:03

心驰神往 发表于 2021-1-19 17:55
不知道,没用过VS。要不你用DEV试试

玄学{:10_243:}

昨非 发表于 2021-1-24 20:17:22

{:10_284:}

永恒的蓝色梦想 发表于 2021-1-25 10:11:54

据我所知, sync 是同步的意思, 功能没有明确定义, 而 clear 是清除错误标识。你根本没有正确清除缓冲区。

星空玩偶,夜云 发表于 2021-1-25 12:22:38

{:10_260:}学到....没看懂,我再去复习一遍

昨非 发表于 2021-1-25 16:30:57

永恒的蓝色梦想 发表于 2021-1-25 10:11
据我所知, sync 是同步的意思, 功能没有明确定义, 而 clear 是清除错误标识。你根本没有正确清除缓冲区。

我之前简单的搜了搜
好像Linux系统的sync命令是同步作用
在c++里,cin.sync是清空数据流没错吧
老哥你先看看这个
http://blog.sina.com.cn/s/blog_8d3652760100wl9r.html

永恒的蓝色梦想 发表于 2021-1-25 21:31:38

昨非 发表于 2021-1-25 16:30
我之前简单的搜了搜
好像Linux系统的sync命令是同步作用
在c++里,cin.sync是清空数据流没错吧


你真正该看的是这个

昨非 发表于 2021-1-26 19:40:45

永恒的蓝色梦想 发表于 2021-1-25 21:31
你真正该看的是这个

这个链接的原文:这个例子说明了 同步 表现为的某些实现 cin,从标准字符输入队列中删除所有未读字符。,说的不就是删除缓冲区中未读入的部分吗?

那应该如何改呢?
例子源自c++ primer的习题集的参考答案
感觉不应该有问题啊?偏偏在vs上就是跑不通

202021130162 发表于 2021-1-28 01:09:44

初学者表示没有关注这种问题{:10_266:}

呆萌的月饼不呆 发表于 2021-1-28 09:44:30

我也没到那种级别

DBMQ 发表于 2021-1-28 16:56:38

看不懂

永恒的蓝色梦想 发表于 2021-1-28 21:46:54

昨非 发表于 2021-1-26 19:40
这个链接的原文:,说的不就是删除缓冲区中未读入的部分吗?

那应该如何改呢?


某些实现都说了是某些实现那就不是所有啊,VS不一样不是很正常

昨非 发表于 2021-1-28 21:54:34

永恒的蓝色梦想 发表于 2021-1-28 21:46
都说了是某些实现那就不是所有啊,VS不一样不是很正常

好的,了解了
谢啦
页: [1]
查看完整版本: 关于getline函数对字符串的处理(c++)