第四章:字符串和格式化输入/输出
本章重点介绍:
1、函数——strlen();
2、关键字——const;
3、字符串;
4、如何创建和存储字符串; 5、如何使用strlen()函数获取字符串的长度;
5、用C预处理器指令#define和ANSIC的const修饰符创建符号常量;
6、输入和输出函数:scanf()和printf()。
(下面这个代码很奇怪,VS运行不起来,但是Dev c++就可以运行起来)

注释:1、使用%s转换说明来处理字符串的输入和输出,使用%f是float的转换符。2、用C预处理器(#define)把字符常量DENSITY定义为62.4。3、用C函数strlen()获取字符串的长度。4、对于sizeof,它不是函数,是C语言中的一个编译时一元运算符, 用于计算其操作数所占内存空间的大小,单位是字节。5、char,它是"character"的缩写,中文名叫字符类型,本质上是一个整数类型,主要用于表示和处理单个字符和构建字符串(本例)。
4.2 字符串简介:例如:"Zhang Haili is a kind person."双引号里面是字符串,双引号就是告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。
4.2.1 char类型和null字符:

字符串都被存储在char类型的数组中,数组末尾处的字符\0,这是空字符。C语言用它标记字符串的结束,4.1代码中有40个存储单元的字符串,但只能存储39个字符串,余一个字节留给空字符。char name[40];方括号表明这是一个数组,40表明该数组中的元素数量。
scanf("%s",name);我输入:Zhang Hali scanf()只读取Zhang,因为它遇到第一个空白(空格、制表符或换行符)就不再读取输入。scanf()只会读取字符串中的一个单词,而不是一整句。后面会提到 fgets(),也是一个输入函数,用于读取一般字符串。以后再说。
4.2.3 strlen()函数:此函数给出字符串中的字符长度,与sizeof 运算符不同,看下列的代码:

翻译输出:你的名字有5个字母,占据了40个记忆单元。
name数组的第6个单元存储空字符,strlen()并未计入其中,sizeof()运算符把字符串中的空字符也计入其中,所以它得出来的数为数组的长度。
%zd转换说明适用于sizeof()和strlen()
#include<string.h> 其中string.h头文件包含多个与字符串相关的函数原型,包括strlen()。一般地,C把函数库中相关的函数归为一类,并为每类函数提供一个头文件,例如,printf()和scanf()函数都属于标准输入输出函数,使用stdio.h头文件。
4.3常量和预处理器:如何创建符号常量? 法一:声明一个变量,然后将变量设置为所需的常量。例如:int house; house=5;
法二:预处理器也可以定义常量:例:#define HOUSE 5 程序中所有的HOUSE都会被替换成5,这一过程被称为编译时替换。这样定义的常量也称为明示常量。用大写表示符号常量是习惯,增强可读性,一看就立刻明白这是一个符号常量。*注意:末尾不用加分号。
#define指令还可以定义字符和字符串常量,前者使用单引号,后者使用双引号。例:1、#define BEEP '\a' 2、#define TEE 'T' 3、#define ESC '\033' 4、#define OOPS "You are a good girl!"
4.3.1 const限定符:用于限定一个变量为只读,声明的是变量,不是常量。例: const int HOUSE=12; 不能改变HOUSE的值!!!(const用起来比#define更灵活)
4.3.2 明示常量:C头文件 limits.h(整数类型)和float.h(浮点类型)略(感觉用不到)
4.4 printf()和scanf() :%d打印整数;%c打印单个字符;%f打印浮点数,十进制;%%打印一个百分号......……%e浮点数,e记数法;
格式字符串中的转换说明一定要与后面的每一项相匹配,否则,结果无意义。
%-10d的意思:负号表示左对齐(正号默认是右对齐);10表示字段宽度为10个字符,如果少于10,右侧会用空格填充;如果超过10,会按实际位数输出(不会截断)。
%10d的意思:正号表示右对齐(默认)。
%5.2f:打印一个浮点数,字段宽度为5字符,其中小数点后有两位数字。


%s:输出字符串;%2s:输出2个宽度的字符串;%24.5s:只取前5个字符,宽度为24,左侧填充空格;.5告诉printf()只打印5个字符。
下面的代码是:写长代码如何断行的示例
#include<stdio.h>
int main(void)
{
printf("这是一种方式写一个");
printf("长句子。\n");
printf("这是一个最新的一种方式写一个"
"长句子。\n");
return 0;
}
4.4.5使用scanf():如果要输入整数2025,就要键入字符2、0、2、5。如果要将其存储为数值而不是字符串,程序就必须把字符依次转换成数值,这就是scanf()要做的。scanf()把输入的字符串转换成整数、浮点数、字符或字符串。(1)如果使用scanf()读取基本变量类型的值,在变量名前加上一个&;(2)如果scanf()把字符串读入字符数组中,不用加&。
1、从scanf()角度看输入:scanf()每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符才开始读取。(自动跳过空白)
实际上,在C语言中scanf()并不是最常用的输入函数,还有其他输入函数,如getchar()和fgets(),这两个函数更适合处理一些特殊情况。

浙公网安备 33010602011771号