C Primer Plus: 第四章 字符串和格式化输入/输出
4.2 字符串简介
%s 转换说明来处理字符串的输入和输出 字符串一定以空字符‘\0’结尾,所以数组的容量必须至少比待存储字符串中的字符数多1. 不用亲自把空字符放入字符串末尾,scnaf()在读取输入时就已经完成这项工作。
char name[40] ;
scanf("s" , name) ;
scanf()只会读取字符串中的一个单词,而不是一整句。 区别strlen() 和 sizeof():strlen()得出的是字符串中的字符数(包括空格和标点符号),但不包括空字符。而sizeof()把字符串末尾看不见的空字符串也计算在内。 sizeof()计算的是整个存储空间的大小
char name[40 ];
name = "abc" ;
sizeof (name);
strlen (name);
4.4 输入输出
编译时替换:#define TAXRATE 0.15 程序中所有的TASRATE都会被替换 区别const 和 #define :const类型限定符声明的是变量,而不是常量,只不过不可以修改。#define 定义的是常量。 size_t定义为系统使用sizeof的返回类型,这被称为底层类型。 prinf()转换说明
五种标记:
1. -:"%-20s" 从字段的左侧开始打印改项
2. +:"%+6.2f" 有符号值若为正,则在值前面显示加号,若为负,则在值前面显示减号
3. 空格:" 6.2f" 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+标记覆盖一个空格
4. #:把结果转换为另一种形式。如果是%o 格式,则以0 开始;如果是%x 或%X 格式,则以0 X或者0 x开始;对于所有浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g 和%G 格式,#防止结果后面的0 被删除。
5. 0 :对于数值格式,用前导0 代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记。
数字:"%4d" 最小字段宽度
.数字:"%5.2f" 精度
z: 表示size_t类型的值
程序把传入prinf()的值放入栈的内存区域。计算机根据变量类型(不是根据转换说明)把这些值放入栈中。然后控制转到printf()函数,函数根据转换说明(不是变量类型)从栈中读取值。 对于scanf()也是使用格式字符串和参数列表。如果读取基本变量类型的值,在变量名前面加一个&;如果是数组,不用使用&(数组名本身就为指针) scanf()读取机制:
1. scanf ()函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符才开始读取。
2. 因为要读整数,所以scanf ()希望发现一个数字字符或者一个符号(+-)如果找到一个数字或者符号,它便保存该字符,并读取下一个字符。如果下一个字符是数字,它便保存该数字并读取下一个字符。不断经历这个过程,直到遇到非数字字符
3. 如果遇到非数字字符,它便认为遇到了整数的末尾,然后scanf ()把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。
4. 如果使用%s转换说明,scanf ()会读取除空白以外的所有字符。这意味着scanf ()会读取一个单词,即不包含空白字符的字符串。
5. scanf ()会把字符串放到数组中,并在末尾加上'\0'
6. scanf ()中的*用法可以是scanf ()跳过相应的输出项。如:scanf ("%*d %*d %d" ,&n);