第四章 字符串和格式化输入/输出¶
注解
- 本章介绍以下内容:
- 函数 strlen()
- 关键字:const
- 字符串
- 如何创建、存储字符串
- 如何使用strlen()函数获取字符串的长度
- 用C预处理器指令#define和ANSIC的const修饰符创建符号常量
本章重点介绍输入和输出。与程序交互和使用字符串可以编写个性化的程序,本章将详细介绍C语言的两个输入/输出函数printf()和scanf()。 最后简要介绍一个重要的工具-C预处理指令,并学习如何定义、使用符号常量。
4.1 前导程序¶
程序清单4.1talkback.c程序
// file:talkback.c #include <stdio.h> #include <string.h> #define DENSITY 62.4 int main(){ float weight,volume; int size,letters; char name[40]; printf("you name\n"); scanf("%s",name); print("%s nameis ",name); scanf("%f",&weight); size = sizeof name; letters = strlen(name); volume = weight/DENSITY; printf("well %s ,you volume is %2.2f cuble \n",name,volume ); return 0; }
- 改程序包含了一下新特性:
- 使用数组储存字符串
- 使用%s转换说明来处理字符串的输入和输出,注意在scanf()中,name,没有&前缀,而weight有。
- 用C预处理器把字符常量DENSITY定义为62.4
- 用C函数strlen()获取字符串的长度。
写到这里的时候有个小插曲,编译的时候提示:
WARNING: Could not lex literal_block as "c". Highlighting skipped.
经检查上面的4-1的代码发生了错误,然后发现是双引号和单引号的区别 , 这个还能检查语法错误呢。不错。
4.2 字符串简介¶
字符串是一个或多个字符的序列
4.2.1 char类型数组和null字符¶
C语言没有专门用于存储字符串变量类型,字符串都被存储在char类型的数组中,数组由连续的存储单元组成,字符串中的字符被存储在响铃的存储单元,每个单元存储一个字符。
字符串末尾字符0 ,这是空字符,C语言用来标记字符串的结束。空字符不是数字0 ,他是非打印字符。
4.2.2 使用字符串¶
- 程序清单4.2 praise1.c
//praise1.c 使用不同类型的字符串 #include <stdio.h> #define PRAISE 'you str an exterraodinaty bering' int main(void){ char name[40]; printf("wath you name"); scanf("%s",name); print("hello %s, .%s \n",name,PRAISE); return 0; }
C语言还有其他输入函数,如fgets() 用于读取一般字符串。后面会详细介绍。
4.2.3 strlen() 函数
用于获取字符串长度
//praise2.c 使用不同类型的字符串 //如果编译器识别不了%zd 尝试换成%u或者%lu #include <stdio.h> #include <string.h> #define PRAISE 'you str an exterraodinaty bering' int main(void){ char name[40]; printf("wath you name"); scanf("%s",name); print("hello %s, .%s \n",name,PRAISE); print("your %zd letters ",strlen(name)); print("%zd",sizeof PRAISE); return 0; }
如果使用ANSI C之前的编译器 必须移除这一行:
#include <string.h>
string.h 头文件包含多个与字符串相关的函数原型,包括strlen()。
另外值得注意的一点,之前使用sizeof 使用了圆括号 本例中没有使用,但还是建议所有情况下都写上圆括号。
4.3 常量和预处理器¶
定义常量:
#define NAME value
这样就是定义了预处理的常量了
4.3.2 明示常量¶
C头文件limits.h 和float.h 分别提供了整数类型和浮点数类型大小限制相关的详细信息,
4.4 printf() 和scanf()¶
输入输出函数
4.4.1 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 |
%% | 打印一个百分号 |
4.4.2 使用printf()¶
略
4.4.3 printf() 的转换说明修饰符¶
略
4.4.4 转换说明的意义¶
转换说明应该与待打印的值类型相匹配。通常都有多种选择,例如打印int类型可以使用%d、%x、%o ,对应的打印double的值可以使用% f、%e、%g
输出较长的字符串的时候,可以使用 反斜杠换行。
4.4.5 使用scanf()¶
- 注意:
- 如果使用scanf()读取基本变量的值,在变量名前面加上一个&
- 如果使用scanf()把字符串读入字符数组中,不要使用&
4.6 本章小结¶
字符串是一系列被视为一个处理单元的字符,在C语言中,字符串是以空字符结尾的一系列字符
strlen()函数说获取字符串长度
C预处理器为预处理器指令查找源代码,并在开始编译程序之前处理他们。
如果对您有用,请我喝杯咖啡吧。