从终端读取一行数据,fgets,gets,c++ string类定义的getline
来源:互联网 发布:数据库开发工程师招聘 编辑:程序博客网 时间:2024/05/22 01:31
从终端读取一行数据,且看fgets,gets的区别,结果说话。
先看fgets.例子如下:
char str[100]; while(fgets(str,100,stdin)!=NULL){ cout<<"***"<<str<<"---"<<endl; }
</pre><pre class="cpp" name="code">/*输入,第二行是一个空行abcdeabc*/
结果:
可以看到,fgets会把包括换行符在内的字符都输入到str中,同时也是以换行符作为结束标记的
再看gets
char str[100]; while(gets(str)!=NULL){ cout<<"***"<<str<<"---"<<endl;}/*输入,第二行是一个空行abcdeabc*/
结果:
可以看到,gets同样以换行符作为结束标记,不同的是,其并不把换行符读取进str中
再看看c++里string类的getline函数
int x;std::string sline;std::cin>>x;getline(std::cin,sline);std::cout<<"*****"<<sline<<"----"<<std::endl;
输入1:4和回车键
结果:
可以看到,程序并未给我们任何输入一行字符串的机会就直接退出了。
输入2: 3abc和回车键
结果:
可以看到,getline函数读取了到了字符abc。
从这两个输入可以推测出,getline是以换行符作为结束标记的(当然可能还有其他版本也许可以更改结束标记),第一个输入:4和回车键,则输入缓冲区有两个字符即4和回车符,cin先从输入缓冲区中把整数4载入x,此时输入缓冲区还剩下回车符,getline读取到缓冲区的回车符直接就结束掉了。所以,输入1的结果和输入2的结果就很显然了。那么如何解决这个问题呢,我们当然希望,可以输入完整数、按完回车之后、再输入字符串的啊。其实知道原理后就明白了,我们只需要把输入缓冲区先强制清空然后在调用getline,代码如下:
int x;std::string sline;std::cin>>x;std::cin.sync();//强制情况缓冲区getline(std::cin,sline);std::cout<<"*****"<<sline<<"----"<<std::endl;
输入:3
abc abc
结果:
除了用cin.sync()之外,还可以使用cin.ignore(),以忽略字符,我们往往只需要忽略输入中的少数字符,因此多数情况是使用ignore的
1 0
- 从终端读取一行数据,fgets,gets,c++ string类定义的getline
- 从终端读取一行数据,fgets,gets,c++ string类定义的getline
- fgets读取一行数据
- fgets()读取一行数据
- fgets()读取一行数据
- fgets() -- 读取文件的一行
- php读取文件一行数据的函数fgets和fgetss
- C语言的fgets() 与 gets()
- fgets:从文件结构体指针stream中每次读取一行数据
- getline(cin,str)无法从终端获数据的问题
- C库提供了三个读取字符串的函数:gets( ) fgets( ) scanf( )。
- C语言字符串读取函数 gets()与fgets()
- string代替char数组的输入输出以及利用getline每次读取一行字符串
- c 中的scanf, gets,fgets
- 数据接受函数的使用场合 gets fgets recv*
- C 中 getline (类似fgets) 的实现方法
- C语言中scanf、gets、fgets的区别
- C++中读取一行数据:get和getline
- 【NOI2012】随机数生成器
- javascript事件冒泡
- mysql复习秘籍
- POJ2255
- 大话设计の结构型
- 从终端读取一行数据,fgets,gets,c++ string类定义的getline
- sqlite学习笔记6:更新表数据-update
- 入睡时分,夜已深,潦草文笔记下博客开篇之日
- Dynamics CRM 2013 停用和激活按钮的显示与隐藏
- HDU-1385 Minimum Transport Cost
- linux下mysql的root密码忘记解决方
- HDU 4944 FSF’s game(数论+递推)
- Swap Nodes in Pairs --成对交换链表节点(重重重)
- apache中ab工具