第4章 字符串和格式化输入/输出

本章介绍以下内容:
函数:strlen()
关键字:const
字符串
如何创建、存储字符串
如何使用strlen()函数获取字符串的长度
用C预处理器指令#define和ANSIC的const修饰符创建符号常量
本章重点介绍输入和输出。与程序交互和使用字符串可以编写个性化的程序,本章将详细介绍C语言的两个输入/输出函数:printf()和scanf()。学会使用这两个函数,不仅能与用户交互,还可根据个人喜好和任务要求格式化输出。最后,简要介绍一个重要的工具——C预处理器指令,并学习如何定义、使用符号常量。

4.1 前导程序

4.2 字符串简介

4.2.1 char类型数组和nill字符

4.2.2 使用字符串

字符串常量"x"和字符常量'x'不同。区别之一在于'x'是基本类型(char),而"x"是派生类型(char数组);区别之二是"x"实际上由两个字符组成:'x'和空字符\0

4.2.3 strlen()函数

运算对象是类型时,圆括号必不可少,但是对于特定量,可有可无。也就是说,对于类型,应写成sizeof(char)或sizeof(float);对于特定量,可写成sizeof name或sizeof 6.28。尽管如此,还是建议所有情况下都使用圆括号,如sizeof(6.28)

4.3 常量和C预处理器

#define NAME value

TAXRATE 要用大写?用大写表示符号常量是 C 语言一贯的传统

还有一个不常用的命名约定,即在名称前带c_或k_前缀来表示常量(如,c_level或k_line)

符号常量的命名规则与变量相同。可以使用大小写字母、数字和下划线字符,首字符不能为数字

4.3.1 const限定符

4.3.2 明示常量

4.4 printf()和scanf()

4.4.1 printf()函数

转换说明(conversion specification),它们指定了如何把数据转换成可显示的形式

第4章 字符串和格式化输入/输出_第1张图片

 表4.3 转换说明及其打印的输出结果

4.4.2 使用printf()

这是printf()函数的格式:
printf( 格式字符串, 待打印项1, 待打印项2,...);

待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量,甚至是在打印之前先要计算的表达式

格式字符串中的转换说明一定要与后面的每个项相匹配,若忘记这个基本要求会导致严重的后果

4.4.3 printf()的转换说明修饰符

在%和转换字符之间插入修饰符可修饰基本的转换说明

第4章 字符串和格式化输入/输出_第2张图片

表4.4 printf()的修饰符

第4章 字符串和格式化输入/输出_第3张图片

 表4.5 printf()中的标记

4.4.4 转换说明的意义

给字符串断行有3种方法:
方法1:使用多个printf()语句。因为第1个字符串没有以\n字符结束,所以第2个字符串紧跟第1个字符串末尾输出。
方法2:用反斜杠(\)和Enter(或Return)键组合来断行。这使得光标移至下一行,而且字符串中不会包含换行符。其效果是在下一行继续输出。但是,下一行代码必须和程序清单中的代码一样从最左边开始。如果缩进该行,比如缩进5个空格,那么这5个空格就会成为字符串的一部分。
方法3:ANSI C引入的字符串连接。在两个用双引号括起来的字符串之间用空白隔开,C编译器会把多个字符串看作是一个字符串。因此,以下3种形式是等效的:
printf("Hello, young lovers, wherever you are.");
printf("Hello, young "   "lovers" ", wherever you are.");
printf("Hello, young lovers"
", wherever you are.");

4.4.5 使用scanf()

如果用scanf()读取基本变量类型的值,在变量名前加上一个&

如果用scanf()把字符串读入字符数组中,不要使用&。

scanf()函数使用空白(换行符、制表符和空格)把输入分成多个字段。在依次把转换说明和字段匹配时跳过空白。注意,上面示例的输入项(粗体部分是用户的输入)分成了两行。只要在每个输入项之间输入至少一个换行符、空格或制表符即可,可以在一行或多行输入:

唯一例外的是%c转换说明。根据%c,scanf()会读取每个字符,包括空白。我们稍后详述这部分

scanf()函数所用的转换说明与printf()函数几乎相同。主要的区别是,对于float类型和double类型,printf()都使用%f、%e、%E、%g和%G转换说明。而scanf()只把它们用于float类型,对于double类型时要使用l修饰符

第4章 字符串和格式化输入/输出_第4张图片

表4.6 ANSI C中scanf()的转换说明 

第4章 字符串和格式化输入/输出_第5张图片

 表4.7 scanf()转换说明中的修饰符

第4章 字符串和格式化输入/输出_第6张图片

除空格字符外的普通字符必须与输入字符串严格匹配

scanf()函数返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0。当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h中定义的特殊值,通常用#define指令把EOF定义为-1

4.4.6 printf()和scanf()的*修饰符

如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用*修饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。也就是说,如果转换说明是%*d,那么参数列表中应包含*和 d对应的值。这个技巧也可用于浮点值指定精度和字段宽度

scanf()中*的用法与此不同。把*放在%和转换字符之间时,会使得scanf()跳过相应的输出项

4.4.7 printf()的用法提示

4.5 关键概念

4.6 本章小结

字符串是一系列被视为一个处理单元的字符。在C语言中,字符串是以空字符(ASCII码是0)结尾的一系列字符。可以把字符串储存在字符数组中。数组是一系列同类型的项或元素。下面声明了一个名为name、有30个char类型元素的数组:
char name[30];
要确保有足够多的元素来储存整个字符串(包括空字符)。
字符串常量是用双引号括起来的字符序列,如:"This is an example of a string"。
scanf()函数(声明在string.h头文件中)可用于获得字符串的长度(末尾的空字符不计算在内)。scanf()函数中的转换说明是%s时,可读取一个单词。
C预处理器为预处理器指令(以#符号开始)查找源代码程序,并在开始编译程序之前处理它们。处理器根据#include指令把另一个文件中的内容添加到该指令所在的位置。#define指令可以创建明示常量(符号常量),即代表常量的符号。limits.h和float.h头文件用#define定义了一组表示整型和浮点型不同属性的符号常量。另外,还可以使用const限定符创建定义后就不能修改的变量。
printf()和scanf()函数对输入和输出提供多种支持。两个函数都使用格式字符串,其中包含的转换说明表明待读取或待打印数据项的数量和类型。另外,可以使用转换说明控制输出的外观:字段宽度、小数位和字段内的布局。
 

你可能感兴趣的:(C,Primer,Plus笔记,c语言,开发语言,学习)