C语言学习日记二
字符串和格式化输入输出
一.字符串简介
字符串(character string)是一个或多个字符的序列,例如"hello world!"
但值得注意的是双引号并不是字符串的一部分。它的作用仅仅是告诉编译器它括起来的是字符串,一如单引号标识单个字符
1. char类型数组和null字符
- C语言没有专门存储字符串的变量类型,字符串都被存储在char类型的数组中,数组是一片连续的存储单元,每个单元存储一个字符
h | e | l | l | o | w | o | r | l | d | ! | \0 |
---|
- 末尾的字符 \0
这是空字符,C语言用它表示字符串的结束,非打印字符,ASCII码值为0。故20个存储单元的字符串,最多只能有19个字符,另一个给空字符,计算机自动添加空字符,不需要人为操作 - 数组是同一类型的数组元素的有序序列,其中存储位置相邻
定义含有40个存储单元的字符char name [40];
2.使用字符串
示例
/* praise1.c -- uses an assortment of strings */
#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
char name[40];
printf("What's your name? ");
scanf("%s", name);
printf("Hello, %s. %s\n", name, PRAISE);
return 0;
}
用%s打印字符串,其中 scanf()函数在遇到第一个空白(空格、制表符或换行符)时就不再读取输入
3. strlen() 函数
strlen() 函数给出字符串中的字符长度,若要使用这一函数则必须添加string.h这个头文件。特别注意的是 strlen() 函数不会计算空字符。
同样的也是用%zd打印,但是值得注意的是用 sizeof() 函数时会计入空字符
示例
/* praise2.c */
// try the %u or %lu specifiers if your implementation
// does not recognize the %zd specifier
#include <stdio.h>
#include <string.h> /* provides strlen() prototype */
#define PRAISE "You are an extraordinary being."
int main(void)
{
char name[40];
printf("What's your name? ");
scanf("%s", name);
printf("Hello, %s. %s\n", name, PRAISE);
printf("Your name of %zd letters occupies %zd memory cells.\n",
strlen(name), sizeof name);
printf("The phrase of praise has %zd letters ",
strlen(PRAISE));
printf("and occupies %zd memory cells.\n", sizeof(PRAISE));
return 0;
}
二、常量和C预处理器
#define NAME value
例如#define TAXRATE 0.015
编译程序时,程序中所有的TAXRATE都会被替换成0.015
不成文的规定是常量用大写字母表示
另外还可以定义字符和字符串
1. const限定符
用于限定一个变量为只读。声明如下:
const int MONTHS = 12;//类似于#define,但更灵活。
2. 明示常量
三、printf() 和 scanf()
1. printf() 函数
转换说明表
转换说明 | 输出 |
---|---|
%a或%A | 浮点数、十六进制数、p计数法 |
%c | 单个字符 |
%d | 有符号的十进制数 |
%e或%E | 浮点数,e计数法 |
%f | 浮点数,十进制计数法 |
%i | 同%d |
%o | 无符号的八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x或%X | 无符号的十六进制整数 |
%% | 打印一个% |
printf() 的修饰符
修饰符 | 含义 |
---|---|
数字 | 最小字段宽度 例如“%4d” |
.数字 | 精度 对于%e和%f而言,表示右边小数点的位数 对于%s而言表示待打印字符的最大数量 对于整数而言,表示待打印数字的最小位数,不够前面添加0 例如:“%5.2f” |
h | 和整型转换一起使用,表示 short int 或 unsigned short int 类型的值 例如:“%hu”、“%hx” |
printf() 的标记
标记 | 含义 |
---|---|
- | 待打印项左对齐 例如:“%-20s” |
+ | 符号值,若正,则值前显加号;反之,添负号 例如“%3.2f” |
空格 | 若值正,值前为空格;若值负,值前添负号 例如:“ % 6.2f” |
# | 将结果表示为另一种形式,如若是%o格式,则以0开头;如若是%x,则以0x开头。 对于所有的浮点格式,即使后面没有数字也要打印小数点 例如“%#o” |
0 | 对于数值格式用前导0代替空格填充字段。对于整数格式,如出现-标记或指定精度,则忽略 例如:“%010d” |
1. printf() 的返回值
若输出正确,它返回打印字符的个数(包括空格和不可见的换行符);
若输出有误,它返回一个负值;
2. 打印较长的字符串
- 使用多个printf() 语句;
- 使用(\)和Enter键组合来断行;
- 使用字符串连接;注意:“young”“lovers"会变成"younglovers"而"young” “lovers"才是"young lovers”,即字符串中必须包含空格;
2.使用scanf()函数
- 读取基本变量类型的值,在变量名前加上一个&;
- 把字符串读入字符数组中,不使用&;
- scanf() 函数使用空白(换行符、制表符、空格)把输入分成多个字段
- 唯一的例外是%c会读取所有的字符,包括空白
转换说明表
转换说明 | 含义 |
---|---|
%c | 把输入解释成字符 |
%d | 把输入解释成有符号的十进制数 |
%e、%f、%g、%a | 把输入解释成浮点数 |
%i | 把输入解释成有符号的十进制整数 |
%o | 把输入解释成有符号的八进制整数 |
%p | 把输入解释成 指针(地址) |
%s | 把输入解释成字符串 |
%u | 把输入解释成无符号十进制整数 |
%x | 把输入解释成有符号的十六进制整数 |
转换说明中的修饰符
转换说明 | 含义 |
---|---|
* | 抑制赋值 例如: “%*d” |
数字 | 最大字段宽度。输入达到最大字段宽度处,或第一次遇到空白字符停止 例如:“%10s” |
hh | 把整数当成signed char 或 unsigned char 类型读取 例如"%hhd" |
ll | 把整数作为long long 或unsigned long long 类型读取 例如:“%lld” |
h、l | 可以以此类推 |
1.格式字符串中的普通字符
- scanf() 函数允许把普通字符放在格式字符串中,除空格字符外的普通字符必须与输入字符串严格匹配。
- 除了%c,其他转换说明都会自动跳过待输入值前面的所有空白。
2. scanf()的返回值
- scanf()函数返回成功读取的项数。若没有读取任何项,且读取错误时(需要数字却输入字符),scanf() 返回0。
四、一些补充
- 在printf() 两个转换说明中间插入一个空白字符,可以确保即使一个数字即使溢出自己的字段,也不会挨着下一个数字一起输出。
- printf() 函数可以用*修饰符来代替字段宽度 ,例如
printf("The number is :%*d:\n",width,number)//width提供字段宽度,number是待打印的数字
。 - scanf() 函数中的*,把*放在%和转换字符之间,会使得scanf()跳过相应的输出项。