一个标准的 C++ 程序,基本上都会涉及到数据的输入和输出,可以把我们要写的程序想像成一个黑盒子,一端输入数据,经过程序的各种魔法处理,再输出处理后的数据。
前面的程序中,我们已经有使用 cin
来读入数据,使用 cout
来输出数据,而且我们也知道了它们是属于标准输入输出流中的一部分。
cin
与cout
要使用 cin
与 cout
,需要引入 iostream
头文件。iostream
是 input / output stream 的缩写,它是 C++ 中用于数据输入与输出的标准头文件,属于 C++ 标准函数库的一部分。
endl
代表 end line,简单说就是换行,也可以换成 \n
,是同样的效果。
假设有下面一段代码去读入字符串:
输入数据
运行程序,得到
可以发现,后面的 world!
没有读进来,这是因为在默认情况下,无论使用 cin
还是 scanf()
来读入数据,在遇到空格或换行后都会停止读入。
如果要读入完整一行内容(包括空格),可以使用getline()
。
运行程序,输出结果正确。
偶尔我们还会同时使用 cin
和 getline()
去读入数据,这里就很容易遇到读入空行的问题。
比如说,我们希望读入下面这样的数据,一行是年龄,一行是姓名:
我们很容易写出下面这段代码:
运行程序,与期待的结果不一样,发现第二行字符串 Jordan Chan
没有读入进来。
这是因为,当我们使用 cin
读完 18 就停下来了(停在 18 与换行符之间),当使用 getline()
读入时,会首先读入 18 后面的换行符,然后就停下来,因此多读入了一个空行,反而真正想读的下一行数据没有读入进来。
解决办法,在 cin
后添加语句 cin.ignore()
,忽略掉 cin
后面的换行符。
scanf()
与printf()
要使用scanf()
与printf()
,需要引入 cstdio
头文件。cstdio
是将 C 中的 stdio.h
内容以 C++ 头文件的形式表示出来的写法,stdio.h
是 C 标准函数库中的头文件,是 standard buffered input & ouput 的缩写。
下面的代码我们使用了 scanf()
来读入数据,使用 printf()
来输出数据。
这里双引号中的百分号 %
,代表后面紧跟的是格式化指令,不同的变量类型,对应不同的格式指令,下面是几组常见的格式化类型指令。
%d
,这里的 d
代表 decimal,表示以整数输出%f
,这里的 f
代表 float,表示以浮点数输出%lf
,这里的 lf
代表 double,表示以双精度浮点数输出%s
,这里的 s
代表 string,表示以字符串输出%c
,这里的 c
代表 character,表示以字符输出格式化指令当然不止这些,记住一些常用的就行了,在实际使用中,那些不常见的指令可以去查阅相应的文档。
下面两种情况,建议使用 scanf() / printf()
:
printf()
更为方便scanf()
读入,效率会更高一些一般来说,在使用
cin
或cout
的地方,一定可以替换为scanf
或printf
,反过来就不行!
当我们在输入数据时,很多时候都会涉及到结果的格式化输出。
来看一个简单的例子。
下面是几组输入输出数据。
输入数据 1
输出数据 1
输入数据 2
输出数据 2
输入数据 3
输出数据 3
如果将程序改为 scanf
和 printf
输入输出,代码如下所示:
同样的上面三组输入数据,结果如下。
输入数据 1
输出数据 1
输入数据 2
输出数据 2
输入数据 3
输出数据 3
可以发现它们之间的区别。
cout
输出时,结果默认保留 6 位数字(除开小数点后的所有数字)printf
输出时,结果默认保留小数点后 6 位数字在实际应用中,我们如何去控制输出数据的格式呢,比如,如果想结果保留小数点后两位,该怎么做?
cout
进行格式化输出这里有两点需要注意:
<iomanip>
头文件,或者使用万能头文件setprecision
用于设置精度,但精度所代表的具体含义是由 fixed
来确定的,加上 fixed
,表示保留小数点后两位,如果没有 fixed
,表示除开小数点后保留两位数。printf
格式化输出用 printf()
实现同样的保留小数点后两位输出,代码如下:
这里的 .2f
表示结果以浮点数(float
)输出,并且小数点后保留两位,相比 cout
的格式化输出更加简洁、直观。
对于一些比较复杂的格式化输出,使用 printf()
可能会更方便一些。
例如,我们想希望输入两个整数 和 ,按下面的指定格式输出。
输入:
输出:
如果使用 cout
输出,代码如下:
使用 printf()
输出,代码如下:
可以直观看到,使用 printf()
的格式化输出同样会更简洁一些。
在本章节中,我们快速梳理了一下 C++ 中与输入输出相关的基本知识点,在实际应用中,关于输入输出的内容还有很多,比如更多的格式化输出、说文件读入与输出等高级主题,对于初学者和刚入门的竞赛选手来说,掌握上面的这些知识点基本上够用了。