文章目录
自言自语🤷♀️
今天主要学习了:
- 三个函数:printf()、scanf()、strlen()。
- 关键字:const、sizeof
- 字符串
- 如何创建、存储字符串
- 怎样使用strlen()函数来获取字符串长度及其与sizeof()的区别。
- 使用预处理指令#define 和ANSIC的const 修饰符创建符号常量。
1. printf() & scanf()🤸♂️
首先这两个函数都是C语言里面的标准输入输出函数。
虽然printf()是输出函数,scanf()是输入函数,但是他们的工作原理都差不多。
这两个函数都使用格式字符串和参数列表。
1.1. printf()👣
这个函数的打印数据的指令和待打印数据类型要相同。
即:打印整型使用%d,打印字符使用%c,打印字符串使用%s等等。
printf(格式字符串, 待打印项1, 待打印项2,…);
返回值:返回打印字符的个数。包括空格和不可见的换行符(\n)在内。
1.1.1. printf() 转换说明👍
%d %c %s 这一类符号被称为转换说明(conversion specification)
转换说明的意义: 转换说明把以二进制格式存储在计算机中的值转换成一系列字符(字符串)以便于显示。
比如:数字76在计算机内部的存储格式是二进制01001100.
%d转换说明将其转换成字符7 和 6,并显示为76;
%x转换说明把其转换成4 和 c,并显示为4c。
转换说明 | 输出 |
---|---|
%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 |
%% | 打印一个百分号% |
1.1.2. printf() 修饰符🎈
修饰符 | 含义 |
---|---|
标记 | 表 3. 描述了5种标记(- + 空格 #和 0), 可以不使用标记和使用多个标记 示例: "%-10d"表示字段宽度为10个字符, "-"表示左对齐 |
数字 | 最小字段宽度, 如果该字段不能容纳待打印的内容, 系统会使用更宽的字段 示例: “%4d” 表示字段宽度为4个字符 |
.数字 | 表示精度 对于%e, %E, %f转换, 表示小数点右边的数字位数 对于%g和%G转换, 表示有效数字最大位数 对于%s转换, 表示待打印字符的最大数量 对于整型转换, 表示待打印数字的最少位数 如有必要,使用前导0来达到这个位数 只使用 . 表示其后跟着一个0, 所以%.f和%.0f相同 示例: "%4.2f"表示打印一个浮点数, 字段宽度为4字符, 小数点后保留两位小数 |
h | 和整型转换一起使用, 表示unsigned short int 或 short int 类型的值 示例: “%hu” , “%hx”, “%4.2hd” |
hh | 和整型转换一起使用, 表示signed char 和 unsigned char 类型的值 示例: “%hhu”, “%hhx”, “%5.2hhd” |
j | 和整型转换一起使用, 表示intmax_t 和 uintmax_t 类型的值, 这些值定义在<stdint.h>头文件里 示例: “%jd”, “%3jx” |
l | 和整型转换一起使用, 表示long int 和 unsigned long int 类型的值 示例: “%ld”, “%8lu” |
ll | 和整型转换一起使用, 表示 long long int 和 unsigned long long int 类型的值 示例: “%lld” , “%8llu” |
L | 和浮点转换一起使用, 表示long double 类型的值 示例: “%Lf”, “%10.4Le” |
t | 和整型转换一起使用, 表示ptrdiff_t . 其是两个指针差值 类型的值 示例: “%td”, “%12ti” |
z | 和整型转换一起使用, 表示size_t 类型的值. size_t是sizeof返回的类型 示例: “%zd”, “12zd” |
标记 | 含义 |
---|---|
- | 待打印项左对齐.即, 从字段的左侧开始打印该项 |
+ | 有符号值若为正, 则在值前面显示 + 号; 若为负, 则在值前面显示减号. "%+6.2f" |
# | 把结果转换为另一种形式. “%#o” --> 012(8进制), “%#x” --> 0xA4(16进制).对于所有浮点格式, #保证了即使后面没有任何数字, 也打印一个 “.”.对于%g或%G格式, #防止结果后面的0被删除. 示例: “%#o”, “%#8.0f”, “%+#10.4e” |
空格 | 有符号值若为正, 则在值前面显示前导空格(不显示任何符号); 若为负, 则在值前面显示减号 示例: " %6.2f" |
0 | 对于数值格式,用前导0代替空格填充字段宽度.对于整数格式, 如果出现"-"标记或指定精度, 则忽略该标记. 示例: “%010d”, “%0.83f” |
1.2. scanf()🐸
-
scanf()函数可以读取不同格式的数据。其将输入的字符串转换成整数、浮点数、字符或字符串。
scanf()函数也是使用格式字符串和参数列表。
值得注意的是:
scanf()需要使用指向变量的指针。
如果使用scanf()读取基本变量类型的值,在变量名前加上一个取地址符&。
如果使用scanf()读取字符串到数组中,则不需要使用&,因为数组名相当于一个指针指向数组的首地址。 -
scanf()函数使用空白(制表符,换行符和空格)把输入分成多个字段。
在依次把转换说明和字段匹配时跳过空白(不管空白有多少)。
例外的是%c转换说明。根据%c,scanf()会读取每个字符,包括空白。 -
scanf()的转换说明和printf()的转换说明几乎相同。
区别在于:
对于float和double类型,printf()都使用%f, %e, %E,%g和%G。而scanf()只把他们用于float,对于double需要使用 ‘l’修饰符。 -
返回值
:scanf()返回成功读取的项数。
如果需要读取数字,但没有读取任何项,则会返回0。
当scanf()读取到文件末尾时,会返回一个EOF(EOF是stdio.h中定义的特殊值,#define EOF -1)。 -
scanf()中,把“*”放在%和转换字符之间时,会是的scanf()跳过相应的输出项。这在程序需要读取文件中特定的内容时,很有用。
2. strlen() 函数 & sizeof()运算符😽
-
注意:
strlen()是一个函数。
sizeof()是一个运算符。 -
sizeof() 以字节为单位给出对象的大小(包括字符串末尾不可见的 “\n” 结束符)。
strlen()给出字符串中的字符长度(不包括 “\n” ) -
sizeof()的返回类型添加了%zd转换说明,对于strlen()也适用。
3. #define & const👻
#define NAME value
表示使用NAME 来代表value。- 注意:
#define NAME value
末尾没有分号。其中的NAME建议使用全部大写,这是一个好的编程习惯。 - #define还可以定义字符和字符串常量
#define BEEP '\a'
#define TEA 'T'
#define ESC '\033'
#define OOPS 'Hello OKfine!'
const
用于限定一个变量
为只读。
4. 字符串📌
字符串(character string)
是一个或多个字符序列。- 字符串都被存储在
char
类型的数组中。数组由连续的存储单元组成,每个单元存储一个字符,每个存储单元为一个字节
- 数组的容量必须比字符串的长度大一个字节,最后一个字节用来存储
空字符 "\0"
. - scanf()在读取字符串时(%s),从第一个非空字符开始读取,直到遇见下一个空字符停止。
例如:输入Hello OKfine
, scanf()只会读取完Hello就停止了。
5. “ * ”修饰符✨
- printf()函数的 * 修饰符。
如果你不想预先指定字段宽度,希望通过程序来指定。
则可以这样使用:printf("%*s\n", length, your_string);
length
就是通过程序计算出来的值,它对应" * ";
your_string
就是你要打印的字符串,对应 s。
下面第二个小练习就有对应的程序。
6. 8个小练习😀
🐵ONE
- 编写一个程序,提示用户输入名和姓,然后以“名,姓”格式打印出来。
设计:
|—首先提示用户输入first name,再输入last name。
|—用户输入名字保存在char first_name[32];数组中。
|—用户输入last name保存在char last_name[32];数组中。
|—最后将first_name , last_name中的值按照“名,姓”格式显示出来。
/*
* OS: linux
* Time: 2020/04/23
* Author: OKfine.
*/
#include <stdio.h>
int main()
{
char first_name[32];
char last_name[32