微信公众号的模板网站,东莞常平嘉华学校,直接进入网址的浏览器,做报废厂房网站怎么做学习笔记——《C Primer Plus》 第4章 字符串和格式化输入/输出4.1 前导程序4.2 字符串简介4.2.1 char 类型数组和 null 字符4.2.2 使用字符串4.2.3 strlen() 函数4.3 常量和 C 预处理器4.3.1 符号常量1. 使用**符号常量**的好处:2. 创建符号常量4.3.2 const 限定符4.3.3 转换说…学习笔记——《C Primer Plus》
第4章 字符串和格式化输入/输出4.1 前导程序4.2 字符串简介4.2.1 char 类型数组和 null 字符4.2.2 使用字符串4.2.3 strlen() 函数4.3 常量和 C 预处理器4.3.1 符号常量1. 使用**符号常量**的好处:2. 创建符号常量4.3.2 const 限定符4.3.3 转换说明的意义4.4 printf() 和 scanf()4.4.1 printf() 函数4.4.2 scanf() 函数4.4.3 printf() 和 scanf() 的 * 修饰符4.1 前导程序
#include stdio.h
#include string.h //提供 strlen() 函数的原型
#define DENSITY 62.4 //人体密度单位磅/立方英尺int main(void)
{float weight, volume;int size, letters;char name[40]; // name 是一个可容纳40个字符的数组printf(Hi! Whats your first name?\n); scanf(%s,name);printf(%s,whats your weight in pounds?\n,name);scanf(%f, weight);size sizeof name;letters strlen(name);volume weight / DENSITY;printf(Well, %s, your volume is %.2f cubic feet\n, name, volume);printf(Also, your first name has %d letters,\n, letters);printf(and, we have %d bytes to store it.\n, size);return 0;}运行结果
用数组array储存字符创character string。在该程序中用户输入的名被储存在数组中该数组占内存中40个连续的字节每个字节储存一个字符值。使用 %s 转换说明来处理字符串的输入和输出。注意在 scanf() 中name 没有前缀而 weight 有因为用 scanf() 把字符串读入字符数组中不用 。用 C 预处理器把字符常量 DENSITY 定义为 62.4。用 C 函数 strlen() 获取字符串的长度。
4.2 字符串简介
字符串character string是一个或多个字符的序列如下所示
char ch;
ch “Zing went the strings of my heart!”;双引号不是字符串的一部分。 双引号仅告知编译器它括起来的是字符串正如单引号用于标识单个字符一样。
4.2.1 char 类型数组和 null 字符
C 语言没有专门用于储存字符串的变量类型字符串都被储存在 char 类型的数组中。 数组由连续的存储单元组成字符串中的字符被储存在相邻的存储单元中每个单元储存一个字符。 注意 图中数组末尾位置的字符 \0 。这是空字符null characterC语言用它标记字符串的结束。 C 中的字符串一定以空字符结束这意味着数组的容量必须至少比待存储字符串中的字符数多 1。 数组 同类数据元素的有序序列。 如前导程序中通过以下声明创建了一个包含40个存储单元或元素的数组每个单元储存一个 char 类型的值
char name[40];name 后面的方括号表明这是一个数组方括号中的 40 表明该数组中的元素数量。char 表明每个元素的类型。
4.2.2 使用字符串
#include stdio.h
#define PRAISE You are a extraordinary being!int main(void)
{char name[40];scanf(%s, name);printf(Hello, %s , %s\n,name, PRAISE);return 0;
}%s 告诉 printf() 打印一个字符串。 %s 出现两次因为程序要打印两个字符串一个储存在 name 数组中一个由 PRAISE 来表示。 不用亲自把空字符放入字符串末尾scanf() 在读取输入时就已经完成这项工作。 输出结果 注意 scanf() 在遇到第一个空白空格、制表符或换行符时就不再读取输入。因为根据转义字符 %s scanf() 只会读取字符串中的第一个单词。
字符和字符串 字符常量 ‘x’ 和字符串常量 “x” 不同 区别一是 ‘x’ 是基本类型char而 “x” 是派生类型char 数组 区别二是 “x” 实际上由两个字符组成‘x’ 和空字符 \0。
4.2.3 strlen() 函数
sizeof 运算符
是以字节为单位给出对象的大小它会把字符串末尾不可见的空字符也计算在内运算对象是类型时必须加圆括号如sizeof(int);运算对象是特定值圆括号可有可无建议所有情况都加上圆括号。用转义说明 %zd 。
strlen() 函数
给出字符串中的字符长度也就是字符串中的字符数包括空格和标点符号。用转义说明 %zd 。
4.3 常量和 C 预处理器
有时在程序中要使用常量。 例如计算圆周长
circumference 3.14159 * diameter;但使用 符号常量 (symbolic constant) 会更好计算机会给出实际值完成替换
circumference pi * diameter;4.3.1 符号常量
1. 使用符号常量的好处:
常量比数字表达的信息更多。更改起来更加方便如果程序使用符号常量只需更改符号常量的定义无序逐一修改。
2. 创建符号常量
法一
float taxrate;
taxrate 0.015;这样做提供一个符号名但 taxrate 是一个变量程序可能会无意间改变它的值。
法二C 预处理器
/*格式
#define NAME value 没有 和 全大写表示符号常量是C语言的一贯传统
这样在程序中看到全大写就立刻明白是个符号常量而非变量。
*/
#define TAXTATE 0.15小练习
#include stdio.h
#define PI 3.14259
int main(void)
{float area, circum, radius;printf(Whats the radius of your pizza?\n);scanf(%f, radius);area PI * radius * radius;circum PI * radius * 2.0;printf(Your basic pizza parameters are as follows:\n);printf(circumference: %1.2f, area: %1.2f.\n, circum , area);return 0;
}printf() 语句中 %1.2f 表明结果被四舍五入为两位小数输出。
#define 指令还可以定义字符和字符串常量前者用单引号后者用双引号。
#define BEEP \a
#define TEE T
#define ESC \033
#define OOPS Now you have done it!4.3.2 const 限定符
C90 标准新增了 const 关键字用于限定一个变量为只读。其声明如下
const int MONTHS 12; //MONTHS在程序中不可更改值为12MONTHS 成为一个只读值。也就是说可以在计算中使用MONTHS可以打印MONTHS但是不能更改MONTHS的值。 const 用起来比 #define 更加灵活。
4.3.3 转换说明的意义
转换说明把二进制格式储存在计算机中的值转换成一系列字符字符串以便显示。
4.4 printf() 和 scanf()
4.4.1 printf() 函数
printf() 函数把整数、浮点数、字符和字符串转换成显示在屏幕上的文本 由于 printf() 函数使用 % 符号来标识转换说明 如果要打印一个 % 符号就使用两个 % 符号。
pc 2*6;
printf(Only %d%% of Sallys gribbles were edible.\n);
/*输出结果
Only 12% of Sallys gribbles were edible.
*/当 printf() 语句太长可给语句分行但是不能在双引号括起来的字符串中断行。
4.4.2 scanf() 函数
scanf() 函数把输入的字符串转换成整数、浮点数、字符或字符串。 printf() 函数使用变量、常量和表达式而 scanf() 函数使用指向变量地址的指针。
如果用 scanf() 读取基本变量类型的值在变量名前加上一个如果用 scanf() 把字符串读入字符数组中不使用。
#include stdio.h
int main(void)
{int age;float assets;char pet[30];printf(Enter your age,assets,and favourite pet.\n);scanf(%d %f,age,assets);scanf(%s,pet);printf(%d %.2f %s\n,age ,assets,pet);return 0;
}输出结果 scanf() 函数使用空白换行符、制表符和空格把输入分为多个字段。在依次把转换说明和字段匹配时跳过空白。 注意 %c 转换说明根据 %c scanf() 会读取每个字符包括空白。
格式字符串中的普通字符 scanf() 函数允许把普通字符放在格式字符串。除空格字符外的普通字符必须与输入字符串严格匹配。如在两个转换说明中添加一个逗号
scanf(%d,%d, n, m);scanf() 函数将其解释成用户将输入一个数字、一个逗号然后再输入一个数字。
注意 除了 %c 其他转换说明都会自动跳过待输入值前面所有的空白。 对于 %c如果在格式字符串中把空格放到 %c 的前面scanf() 便会跳过空格从第1个非空白字符开始读取。
4.4.3 printf() 和 scanf() 的 * 修饰符
printf() 函数的 * 修饰符: 如果你不想预先指定字段宽度希望通过程序来指定那么可以用 * 修饰符代替字段宽度。 但还是要用一个参数告诉函数字段宽度应该是多少。 如果转换说明是 %*d 那么参数列表中应包含 * 和 d 对应的值。