【C/C++】如何帅气地在C/C++中输入字符串
1. C-风格字符串输入
1.1 scanf
使用 scanf
可以输入不带空格的字符串。
char str[100];
scanf("%s", str);
printf("%s\n", str);
输入: Hello World
输入: Hello
scanf
遇到空格后就会停止读入,余下的部分自动留在缓冲区内。
char str[100];
int i = 1;
while (~scanf("%s", str))printf("String %d: %s\n", i++, str);
输入:
Hello World, Everyone!
输入上面一行内容,按下回车键后,会一次性输出三行内容。
输出:
String 1: Hello
String 2: World,
String 3: Everyone!
1.2 gets
/fgets
gets
char* gets(char*buffer)
从键盘上输入字符,直至接受到换行符或 EOF 时停止,并将读取的结果存放在 buffer
指针所指向的字符数组中。读入完成后自动在 buffer
末尾添加 \0
。
注意,即使最后读取到了 \n
符号,也不会把它放入到 buffer
末尾。
返回值为 buffer
,如果 EOF 了,返回 NULL
。
char str[100];
int i = 1;
while (gets(str))printf("String %d: %s\n", i++, str);
输入输出:
Hello World! My friend.
String 1: Hello World! My friend.
Support Vector Machine
String 2: Support Vector Machine
注意到 str
末尾是没有换行符的,gets
把换行符丢弃了!
fgets
gets
在新的 C 标准中被废弃了,原因在于它是不安全的,可以用 fgets
替代。
char * fgets ( char * str, int num, FILE * stream );
需要在 num
参数处指定限制字符数量,然后在 stream
处指定输入流。
fgets
和 gets
有一个重要的不同。那就是它会保留输入中的换行符。
const int MAX_LEN = 20;
char str[MAX_LEN];
int i = 1;
//注意,换行符会被保留
while (fgets(str, MAX_LEN, stdin))printf("String %d: %s|\n", i++, str);
输入输出:
Hello World!
String 1: Hello World!
|
I am a boy!
String 2: I am a boy!
|
^Z终端将被任务重用,按任意键关闭。
1.3 cin >>
1.1.1 使用方式
char sz[20];
cin >> sz;
1.1.2 细节知识点
用 cin
读取时,它会将回车键生成的换行符保留在缓冲区中。
这点很重要,与之后 getline()
和 get()
函数出现的问题有关。
1.1.3 存在的问题
引例
char sz[20];
char str[20];
cin >> sz;
cin >> str;
cout << sz << endl;
cout << str << endl;
输入
hello world //按回车键
输出
hello
world
原因
cin
使用空白符号来确定字符串结束的位置,这意味着字符数组在输入时一次只读入一个单词。
cin
将该单词放入数组之中,自动添加空字符,而输入的其余内容则留在缓冲区中。
1.4 cin.getline()
1.2.1 使用方式
istream &getline(char *buffer, streamsize num);
istream &getline(char *buffer, streamsize num, char delim);
getline()
函数用于输入流,读取字符到 buffer 中,直到下列情况发生:
- num - 1个字符已经读入,
- 碰到一个换行标志,
- 碰到一个EOF,
- 任意地读入,直到读到字符delim。delim字符不会被放入buffer中。
样例
char sz[20];
char str[20];
cin.getline(sz, 20);
cin.getline(str, 20);
cout << sz;//注意没有endl
cout << str << endl;
输入
hello world //按回车键
here //按回车键
输出
hello worldhere
//endl空行
1.2.2 细节知识点
- 若参数num为n,则最多读入n-1个字符。
getline()
函数每次读取一行。它通过换行符确定行尾,但不会将换行符留在缓冲区中,而是将换行符用空字符替换保留在字符串中。
以上面的例子为例,在输入hello world之后按下了回车键。
hello world //回车键
但输出时并没有空行。
hello worldhere//没有空行
空行
1.2.3 存在的问题
读入空行
引例
对一下程序
char sz[10];
char str[20];
cin >> sz;
cin.getline(str, 20);
cout << "sz: " << sz << endl;
cout << "str: " << str << endl;
return 0;
首先以一个输入方式为例。
- 不会出错的输入
her name//按回车键
输出
hername//注意前面的空格
cin
在读到her
后面的空格后结束,并且将空位符留在缓冲区中,由下一个字符串读取。
由此我们可以引出一个常见的错误
- 会出错的输入
her//按回车键
//无法输入下一个字符串,直接输出
输出
her
这是由于cin
将回车键产生的换行符留在缓冲区内所以直接被str
读取。 所以str
注意,
cin >>
与cin.getline()
连用要小心
而对于cicin.getline()
的连用,由于该函数不会将换行符留在缓冲区中,因此连用时没有读取空行的担忧。
也就是说
//这是可行的
cin.getline(sz, 20);
cin.getline(str, 20);
解决办法
cin >> sz;
//法一
cin.get();
//法二,ignore()默认忽略eof标识前一个字符
cin.ignore();
字数超长问题
如果输入行包含的字符比指定的字符数多,getline()
会将剩余的字符留在缓冲区中,然后设置失效位,并关闭输入。
1.5 cin.get()
1.3.1 使用方式
原型
int get();
istream &get( char &ch );
istream &get( char *buffer, streamsize num );
istream &get( char *buffer, streamsize num, char delim );
istream &get( streambuf &buffer );
istream &get( streambuf &buffer, char delim );
get()函数被用于输入流,和以下这些:
- 读入一个字符并返回它的值,
- 读入一个字符并把它存储在ch,
- 读取字符到buffer直到num - 1个字符被读入, 或者碰到EOF或换行标志,
- 读取字符到buffer直到已读入num - 1 个字符,或者碰到EOF或delim(delim直到下一次不会被读取),
- 读取字符到buffer中,直到碰到换行或EOF,
- 读取字符到buffer中,直到碰到换行,EOF或delim。(相反, delim直到下一个get()不会被读取 ).
1.3.2 细节问题
2. string
输入
2.1 cin >>
2.1.2 使用方法
同上,一次只能读取一个单词。
注意这里读取时利用while
的技巧
int main()
{string line;ifstream in;//每次读取一个单词,直到文件末尾while (in >> word){cout << word << endl;}return 0;
}
2.2 getline()
2.2.1 原型
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
2.2.2 使用方法
同上,遇到换行符为止(delim
),但是终止字符delim
(默认为换行符)并不会留在缓冲区中留给下一位来读取,而是变成了空字符留在了字符串中,不影响输出。(可以当作被丢弃了)
2.2.3 例子
有文件a.txt
:
Iam a boy
Helloaworld
程序如下:
int main()
{ifstream fin("a.txt");string str;//每次读取一段文字,直到文件末尾EOFwhile (getline(fin, str, 'a')){cout << str << endl;}system("pause");return 0;
}
输出结果:
I//遇到了a停止读入
m//字符a没有被读入下一个strboy //遇到了a停止读入,但空格被下一个str读入了
Hello
world
【C/C++】如何帅气地在C/C++中输入字符串相关推荐
- Microsoft Academic Search vs Google Scholar
一直以来找论文等学术资料都是去校图书馆的,校图书馆对于在校生是最好不过的了,内容针对性强,又对学生免费.但是不方便访问学校图书馆的人们通常通过免费的学术搜索引擎来查找学术文献.本篇文章对微软的Micr ...
- 英飞凌AI越野组入门教程
逐飞科技 2021-02-03 Wednesday 该学习教程由英飞凌委托"逐飞科技"探索.验证并完成教程编写,现在公开发布给所有电磁越野组的参赛同学参考使用,如果同学们试图采 ...
- Jmeter + Grafana + InfluxDB 性能测试监控
阅读目录 1. 安装InfluxDB 2. 安装Grafana 3. 配置Jmeter 序章 前几天在群里看到大神们在讨论Jmeter + InfluxDB + Grafana监控.说起来Jmeter ...
- 【LaTeX】E喵的LaTeX新手入门教程(5)参考文献、文档组织
这不是最后一篇,明天开始建模所以会从6号开始继续更新.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版 [LaTeX]E喵的 ...
- AI小编问世!阿里智能写手核心技术首次公开!
一. 引言 内容化已经成为淘宝近几年发展的重点,我们可以在手机淘宝APP(以下简称手淘)上看到很多不同的内容形式和内容型导购产品,例如,"有好货"中的以单个商品为主体的富文本内容, ...
- 《鬼泣V》:旧时代的标杆在新时代的窘境
开始动笔的时候我看了下日期,今天是四月二十二日,距<只狼>发售的2019年3月22日过去了正好一年零一个月,距<鬼泣V>的2019年3月8日也已经一年多了. 一年之前的这个时候 ...
- 谁是最好的Coder
描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所以他选了帅气和编程水平作为评选标准. 每个同学的综合得分是帅气程度得分与编程水平得分的和. 他希望你能写一个 ...
- python人脸照片分类_Python OpenCV 人脸识别(一)
前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...
- python的图书管理项目教程_基于python图书馆管理系统设计实例详解
写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担 ...
最新文章
- 交换两个变量的值不使用第三个变量(Java)
- 美多商城之项目准备-工程创建和配置
- cwRsync 同步时报错 STATUS_ACCESS_VIOLATION
- iOS开发之图片分辨率与像素对齐
- oracle两列同时去重_Oracle表中重复数据去重的方法实例详解
- 如何修改Chrome默认字体
- dj电商-模型类设计-1.x-模型类抽象基类
- JavaScript 编程精解 中文第三版 二十一、项目:技能分享网站
- Bailian4073 最长公共字符串后缀【文本处理】
- 【老孙随笔】想学程序设计,先学人生设计!
- OSI参考模型在网络系统中的应用浅析
- 计算流体力学c语言教程,计算流体力学教程
- 《Thinking in UML》学习1——参与者与用例
- 中国商业环境发展的五个阶段浅析
- 系列超声发现脊柱关节炎附着点处新骨形成
- C#字符串转二进制、二进制转字符串
- 信息与计算机工程学院英文翻译,成都信息工程学院通信工程学院英文翻译.doc...
- mv强制覆盖 shell_Linux 使用 mv 命令重命名或移动文件
- 【图解数据结构】树和二叉树全面总结(上)
- CentOS下下开机启动查看管理命令:chkconfig用法
热门文章
- (十三)《汇编语言(王爽)》 | 实验 8:分析一个奇怪的程序
- vue项目中 img标签加载图片失败,让其显示默认图片
- 浪潮“智行” | 向数字化转型优秀服务商进发
- SCT2430STER 参数, Pin to Pin TPS54340DDAR
- 常用Linux命令的基本实用
- 本是同根生,字节跳动“竞业限制”何太急?
- 【20保研】上海财经大学交叉科学研究院关于举办2019年“上财交叉科学研究院硕博连读选拔夏令营”的通知...
- C# winform窗体程序的美化之路
- C#之Process
- iphone12mini和iphone12se2的区别