C/C++中输入输出函数——scanf/printf


在C++中,scanf函数用于输入,printf函数用于输出,且比cin和cout处理大量数据更加省时。

1.printf函数

printf称为格式化输出函数,私认为在调整输出的方面比C++中标准输出输出cout函数好用,并且更加高效。
函数原型:

int printf(const char * format, [,argument] );

printf函数是一个"可变参数函数"(即函数参数的个数是可变的)。
确切的说,是输出参数的个数是可变的,即原型中的[]部分;
且每一个输出参数的输出格式都有对应的格式说明符与之对应,即格式串format的左端第一个格式说明符对应第一个输出参数,以此类推,也不容易将格式说明符想象成占位符。

格式说明符的一般形式如下(方括号 [] 中的项为可选项):

%[flags][width][.prec][length] type_char
/*用中文标识如下:*/
%[标志符][宽度][精度][长度]类型符
1.1 类型符(type_char)

它用以表示输出数据的类型,下表所示:

符 号类 型说 明示 例结 果
%输出字符“%”本身printf("%%");%
d、iint以带符号十进制整型输出printf("%i,%d", 100,100);100,100
uunsigned int以无符号整型输出printf( “%u,%u”,100u,100);100,100
ounsigned int以八进制无符号整S输出printf( "%o”,100);144
xunsigned int以十六进制小写输出printf("%x",11);b
Xunsigned int以十六制大写输出printf("%X",11);B
ffloat/double小数形式单、双精度浮点数printf("%f",3.14159);3.141590
e/Efloat/double指数形式的单、双精度浮点数printf("%e",3.14159);3.141590e+00
g或Gfloat/double以%f或%e形式输出浮点数printf("%g",3.14159);3.171590
cchar单个字符printf("%c %c %c",‘c’,’+’,’+’);c + +
sstring字符串(字符数组)printf("%s",“welcom to c++”);welcom to c++
p地址输出一个指针string s = “welcom to c++”; printf("%p",&s);32/64位的地址数值

这里注意一个问题:
在C语言中用%s输出字符数组是可以的,
但是如果是输出C++中定义的string类型的字符串,则需要先转换成C字符数组
string str = "hello"; printf("%s",str.c_str());

1.2 标志符(flags)

它用于规定输出格式*(对齐方式),如下表所示。

符号说 明
(空白)右对齐,左边填充 0 和空格
(空格)输出值为正时加上空格,为负时加上负号
-输出结果为左对齐(默认为右对齐),右边填空格
+在数字前增加符号“+”(正号)或“-”(负号)
#类型符是o、x、X吋,增加前缀0、0x、0X;
0参数的前面用0填充,直到占满指定列宽为止(如果同时存在“-”,将被“-”覆盖,导致 0 被忽略
1.3 宽度(width)

它用于控制显示数值的宽度,如下表 所示。

符号说 明
n至少输出 n 个字符(n 是一个正整数)。否则用空格填满余下的位置
0n至少输出 n 个字符(n 是一个正整数)。否则用0满余下的位置
1.4 精度(.prec)

它用于控制显示数值的精度
如果输出的是数字,则表示小数的位数
如果输出的是字符,则表示输出字符的个数
若实际位数大于所定义的精度数,则截去超过的部分。
如下表所示。

符号说明
系统默认精度
.0对于 d、i、o、u、x、X等整形类型符,采用系统默认精度;对于f、F、e、E等浮点类型符,不输出小数部分
.n1) 对于d、i、o、u、x、X类型符,至少输出 n 位数字,且:少于n位,用0填充;对于n位,不截断。
.n2)对于 s 类型符,如果对应的输出串的长度不超过 n 个字符,则将其原样输出,否则输出其头 n 个宁符
1.5 长度(length)

它用于控制显示数值的长度,不常用,感兴趣的同学自己了解。

注意事项:

  • 在调用printf函数时,其参数是从右至左进行处理的,所以尽量不要在 printf 语句中改变输出变量的值
int k=8;
printf("%d,%d\n",k,++k);
/*输出9 9
可以写成
printf("%d\n",k);
printf("%d\n",++k);
*/
  • 每一个输出参数的输出格式都必须有对应的格式说明符与之一一对应,并且类型必须匹配。若二者不能够一一对应匹配,则不能够正确输出,而且编译时可能不会报错;
  • 若格式说明符个数少于输出项个数,则多余的输出项将不予输出;
  • 若格式说明符个数多于输出项个数,则可能会输出一些毫无意义的数字乱码。
1.6 替换符(*)

有时候,我们需要输出的宽度或者位数是实现不确定的,则我们可以在格式串中引入替代符号*,例如

printf("%0*d\n", 5, 10);       // 00010
printf("%.*f\n", 2, 10.12345); // 10.12

若用一个输入的变量来代替*,则我们可以控制输出的宽度。

2.scanf函数

scanf 函数的功能与 printf 函数正好相反,执行格式化输入功能。

  • 即 scanf 函数从格式串的最左端开始,每遇到一个字符便将其与下一个输入字符进行“匹配”,如果二者匹配(相同)则继续,否则结束对后面输入的处理;
  • 而每遇到一个格式说明符,便按该格式说明符所描述的格式对其后的输入值进行转换,然后将其存于与其对应的输入地址中。以此类推,直到格式串结束为止。

函数原型:

int scanf(const char *format[,argument]);

同 printf 函数相似,scanf 函数也是一个“可变参数函数”。
同时,scanf 函数的第一个参数 format 也必须是一个格式化串
除此格式化串之外,scanf 函数还可以有若干个输入地址,且对于每一个输入地址,在格式串中都必须有一个格式说明符与之一一对应。即从格式串的左端第 1 个格式说明符对应第 1 个输入地址,以此类推。

注意:
argument表示参数的地址!要加“&”!

格式说明符(format)的一般形式:

%[*][width][length] type_char
/*用中文标识如下:*/
%[*][宽度][长度]类型符
2.1 类型符(type_char)

1.1类似

格式字符含义
d或i带符号十进制整数
o无符号八进制数
x或X无符号十六进制数
u无符号十进制整数
f、e、E、g、G浮点数
c单个字符
s字符串
2.2 修饰符说明
修饰符说明
*跳过读入数据,不存入对应的argument中
width指定输入数据所占用的宽度
modifiers指定由d、i、x、X、o、u、e、f、g说明的字符的大小
3.注意事项
3.1 自增自减

尽量不要在printf()时,使用自增,自减符,除非你知道printf()对于参数的计算顺序是从优到左,而且对于所有编译器,下面代码的结果不一定相同。

int x;
x = 1; printf("%d %d\n", x, x++);
x = 1; printf("%d %d\n", x++, x);
x = 1; printf("%d %d %d\n", x, x++, x);
x = 1; printf("%d %d %d %d\n", x, ++x, x++, x);
  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值