深入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的前面,所以width在num的前面
再如printf("%*.*d",width,precision,weight)
width和precision提供打印weight的格式化信息
(后续内容会详细说明其意义)
此修饰符可用于:在不同位置(实现前未知)打印指定内容
再来看scanf()
scanf()中*的用法与此不同。把*放在%和转换字符之间时,会使得scanf()跳过相应的输入项。
例如:scanf("%*d %*d %d",&n);
scanf()指示:跳过两个整数,把第3个整数拷贝给n
此修饰符可用于:用户输入三个数,程序选取其中的数进行接下来的实现。
printf()中的标记
| – | 待打印项左对齐。即,从字段的左侧开始打印该项 示例:”%-20s” |
| + | 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号 示例:”%+6.2f” |
| 空格 | 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+ 标记并覆盖空格 示例:”%6.2f” |
| # | 把结果转换为另一种形式。如果是%o格式,则以o开始;如果%x或x 格式,则以 0x或0X 开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0 被删除 示例:”%#0″、”%#8.0f”、”%+#10.3e” |
| 0 | 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记示例:”%10d”和”%08.3f” |