深入char类型及scanf()和printf()的一些特性

char类型数组的定义方式:

例如:char name[40];

C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。

如何给char赋值?
例:scanf("%s",name);
为什么这里不需要&
C语言规定,字符串变量就表示这个字符串存储的首地址,并且由于是连续存储,所以知道了首地址就知道只能存了,因此读取字符串时,就不需要取地址了,本身它就代表地址。详情请戳这里。

目前还未涉及到指针内容,在这里也可以简单的记一下:
如果用scanf()读取基本变量类型的值,在变量名前加上一个&
如果用scanf()把字符串读入字符数组中,不要使用&

printf()转换说明及其打印的输出结果

%a

浮点数、十六进制数和p 记数法(C99/C11

%A

浮点数、十六进制数和p 记数法(C99/C11

%c

单个字符

%d

有符号十进制整数

%e

浮点数,e记数法

%E

浮点数,e记数法

%f

浮点数,十进制记数法

%g

根据值的不同,自动选择%f %e%e 格式用于指数小于-4 或者大于或等于精度时

%G

根据值的不同,自动选择%f%E%E 格式用于指数小于-4 或者大于或等于精度时

%i

有符号十进制整数(与%d相同)

%o

无符号八进制整数

%p

指针

%s

字符串

%u

无符号十进制整数

%x

无符号十六进制整数,使用十六进制数0f

%X

无符号十六进制整数,使用十六进制数0F

%%

打印一个百分号

 printf()scanf()的修饰符*

首先来看printf()
例如:printf("%*d",width,num);
*d的前面,所以widthnum的前面
再如printf("%*.*d",width,precision,weight)
widthprecision提供打印weight的格式化信息
(后续内容会详细说明其意义)
此修饰符可用于:在不同位置(实现前未知)打印指定内容

 

再来看scanf()
scanf()*的用法与此不同。把*放在%和转换字符之间时,会使得scanf()跳过相应的输入项。
例如:scanf("%*d %*d %d",&n);
scanf()指示:跳过两个整数,把第3个整数拷贝给n
此修饰符可用于:用户输入三个数,程序选取其中的数进行接下来的实现。

printf()中的标记

待打印项左对齐。即,从字段的左侧开始打印该项 示例:”%-20s”

+

有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号 示例:”%+6.2f”

空格

有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+ 标记并覆盖空格 示例:”%6.2f”

#

把结果转换为另一种形式。如果是%o格式,则以o开始;如果%xx 格式,则以 0x0X 开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g%G格式,#防止结果后面的0 被删除 示例:”%#0″”%#8.0f””%+#10.3e”

0

对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记示例:”%10d””%08.3f”