鱼C论坛

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

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

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

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

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

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

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


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

  6. #include<iostream>
  7. #include<string>
  8. using namespace std;

  9. int main()
  10. {
  11.         string word, line;
  12.         cout << "请选择读取字符串的方式:1 表示逐词读取,2表示整行读取" << endl;
  13.         char ch;   //输入的选择
  14.         cin >> ch;
  15.         if (ch == '1')
  16.         {
  17.                 cout << "请输入字符串:   Welcome to c++ family!   " << endl;
  18.                 cin >> word;
  19.                 cout << "系统读取的有效字符串是:" << endl;
  20.                 cout << word << endl;
  21.                 return 0;
  22.         }
  23.         //清空输入缓冲区
  24.         cin.clear();
  25.         cin.sync();//清空流

  26.         if (ch == '2')
  27.         {
  28.                 cout << "请输入字符串:   Welcome to c++ family!   " << endl;
  29.                 getline(cin, line);
  30.                 cout<< "系统读取的有效字符串是:" << endl;
  31.                 cout << line << endl;
  32.                 return 0;
  33.         }
  34.         cout << "您得输入有误!";
  35.         return -1;
  36. }
复制代码


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

        按照我的理解,getline函数直到遇到换行符才会终止从输入流中读取数据,
        唯一可能造成这种情况的是2之后的回车,但在getline函数执行前就有

  1.         //清空输入缓冲区
  2.         cin.clear();
  3.         cin.sync();//清空流
复制代码
这样清空输入流缓冲区的操作了啊

        是否是因为vs2019的环境特殊或者是c++标准不同抑或是其他我没有注意到的细节原因造成的问题
最佳答案
2021-1-25 21:31:38
昨非 发表于 2021-1-25 16:30
我之前简单的搜了搜
好像Linux系统的sync命令是同步作用
在c++里,cin.sync是清空数据流没错吧

你真正该看的是这个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-18 22:10:02 | 显示全部楼层
问题没有时间限制的,什么时候看到都可以来回答,恭候指教哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-17 20:04:06 | 显示全部楼层
自顶一下,有无老哥解惑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-19 10:17:58 | 显示全部楼层
顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

我用DEV运行正常

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是VS的问题吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不知道,没用过VS。要不你用DEV试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

玄学
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-24 20:17:22 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +2 鱼币

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

学到....没看懂,我再去复习一遍
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你真正该看的是这个

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

那应该如何改呢?
例子源自c++ primer的习题集的参考答案
感觉不应该有问题啊?偏偏在vs上就是跑不通
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

初学者表示没有关注这种问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

我也没到那种级别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-28 16:56:38 | 显示全部楼层
看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那应该如何改呢?
某些实现
都说了是某些实现那就不是所有啊,VS不一样不是很正常
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,了解了
谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 02:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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