鱼C论坛

 找回密码
 立即注册
查看: 2295|回复: 18

[已解决]关于getline函数对字符串的处理(c++)

[复制链接]
发表于 2021-1-17 10:52:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 昨非 于 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-25 21:31:38
昨非 发表于 2021-1-25 16:30
我之前简单的搜了搜
好像Linux系统的sync命令是同步作用
在c++里,cin.sync是清空数据流没错吧

你真正该看的是这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-18 22:10:02 | 显示全部楼层
问题没有时间限制的,什么时候看到都可以来回答,恭候指教哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-17 20:04:06 | 显示全部楼层
自顶一下,有无老哥解惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-19 10:17:58 | 显示全部楼层
顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-19 10:24:13 | 显示全部楼层

回帖奖励 +2 鱼币

我用DEV运行正常

评分

参与人数 1荣誉 +5 贡献 +1 收起 理由
昨非 + 5 + 1 最佳先不设了,谢了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-19 11:46:41 From FishC Mobile | 显示全部楼层
心驰神往 发表于 2021-1-19 10:24
我用DEV运行正常

是VS的问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-19 17:55:35 | 显示全部楼层

不知道,没用过VS。要不你用DEV试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-19 17:58:03 | 显示全部楼层
心驰神往 发表于 2021-1-19 17:55
不知道,没用过VS。要不你用DEV试试

玄学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-24 20:17:22 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-25 10:11:54 From FishC Mobile | 显示全部楼层

回帖奖励 +2 鱼币

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

评分

参与人数 1荣誉 +5 收起 理由
昨非 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 12:22:38 | 显示全部楼层

回帖奖励 +2 鱼币

学到....没看懂,我再去复习一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-25 21:31:38 | 显示全部楼层    本楼为最佳答案   
昨非 发表于 2021-1-25 16:30
我之前简单的搜了搜
好像Linux系统的sync命令是同步作用
在c++里,cin.sync是清空数据流没错吧

你真正该看的是这个

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
昨非 + 5 + 3 感谢分享这个链接,学了这么久还没查过官方.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 19:40:45 | 显示全部楼层

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

那应该如何改呢?
例子源自c++ primer的习题集的参考答案
感觉不应该有问题啊?偏偏在vs上就是跑不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 01:09:44 | 显示全部楼层

回帖奖励 +2 鱼币

初学者表示没有关注这种问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 09:44:30 | 显示全部楼层

回帖奖励 +2 鱼币

我也没到那种级别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 16:56:38 | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 21:46:54 | 显示全部楼层
昨非 发表于 2021-1-26 19:40
这个链接的原文:,说的不就是删除缓冲区中未读入的部分吗?

那应该如何改呢?
某些实现
都说了是某些实现那就不是所有啊,VS不一样不是很正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-28 21:54:34 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-1-28 21:46
都说了是某些实现那就不是所有啊,VS不一样不是很正常

好的,了解了
谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表