在C语言中,我们常用scanf和printf函数来进行输入和输出,scanf和printf是库函数,在使用时要包含头文件<stdio.h>。
例如,我们常常编写这样的函数:
如上的程序奔溃了,为什么呢?因为我们的数组中只能包含30个字符,但是我们在输入的时候输入了超过30个字符,在我们不知道数组大小的情况下,这样的代码是很危险的,就是说,scanf函数是不安全的。
也许读者会马上想到fgets函数:
fgets函数不但能够从我们输入的超过数组最大值的一段数据中截取29个字符,还能接受小于29个字符的数据:
在C++中为了解决scanf不安全的问题,发明了string字符串类型。
可以看到string的颜色和int的颜色是不一样的,因为string是一个类对象。我们还可以看到string的最大值是1073741820,这个值足以大到一天都输不完。
在C语言的输入输出中对数据的类型有着严格的格式控制,相比C++来说是很不方便的:
使用scanf函数,在给两个不同的变量赋值的时候我们常常用空格或Tab隔开,这样a和b分别被赋值1和2,但是在下面这种情况里:
我们可以看到输入的d被吃掉了,因为空格也是一个字符,被赋给了d。
我们来看看C++中的cin:
cin函数没有把空格赋给c,而是把我们输入的d赋给了c。
关于cout的格式控制:
C语言中printf函数里的格式控制功能很强大,例如设置域宽及位数,按进制输出等,当然C++中也有这样的格式化控制,只是有点复杂而已。
1.设置域宽及位数
setw设置了位宽,效果和printf函数里%5d一样。setprecision(n)能够设置有效位数,setprecision(n)和setiosflags(ios::fixed)一起使用能够设置小数点后的有效位数。
2.按进制输出
int i = 100;
cout<<dec<<i<<endl;//十进制
cout<<oct<<i<<endl;//八进制
cou<<hex<<i<<endl;//十六进制
默认输出十进制。
3.设置填充符
Kyrie Irving___全.