c_primer_plus_CH4

自言自语🤷‍♀️

今天主要学习了:

  1. 三个函数:printf()、scanf()、strlen()。
  2. 关键字:const、sizeof
  3. 字符串
  4. 如何创建、存储字符串
  5. 怎样使用strlen()函数来获取字符串长度及其与sizeof()的区别。
  6. 使用预处理指令#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。

表 1. 转换说明及其打印结果
转换说明 输出
%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() 修饰符🎈

表 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”
表 3. printf()的标记
标记 含义
- 待打印项左对齐.即, 从字段的左侧开始打印该项
+ 有符号值若为正, 则在值前面显示 + 号; 若为负, 则在值前面显示减号.
"%+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()🐸

  1. scanf()函数可以读取不同格式的数据。其将输入的字符串转换成整数、浮点数、字符或字符串。
    scanf()函数也是使用格式字符串和参数列表。
    值得注意的是:
    scanf()需要使用指向变量的指针。
    如果使用scanf()读取基本变量类型的值,在变量名前加上一个取地址符&。
    如果使用scanf()读取字符串到数组中,则不需要使用&,因为数组名相当于一个指针指向数组的首地址。

  2. scanf()函数使用空白(制表符,换行符和空格)把输入分成多个字段。
    在依次把转换说明和字段匹配时跳过空白(不管空白有多少)。
    例外的是%c转换说明。根据%c,scanf()会读取每个字符,包括空白。

  3. scanf()的转换说明和printf()的转换说明几乎相同。
    区别在于:
    对于float和double类型,printf()都使用%f, %e, %E,%g和%G。而scanf()只把他们用于float,对于double需要使用 ‘l’修饰符。

  4. 返回值:scanf()返回成功读取的项数。
    如果需要读取数字,但没有读取任何项,则会返回0。
    当scanf()读取到文件末尾时,会返回一个EOF(EOF是stdio.h中定义的特殊值,#define EOF -1)。

  5. scanf()中,把“*”放在%和转换字符之间时,会是的scanf()跳过相应的输出项。这在程序需要读取文件中特定的内容时,很有用。

2. strlen() 函数 & sizeof()运算符😽

  1. 注意:
    strlen()是一个函数。
    sizeof()是一个运算符。

  2. sizeof() 以字节为单位给出对象的大小(包括字符串末尾不可见的 “\n” 结束符)。
    strlen()给出字符串中的字符长度(不包括 “\n” )

  3. sizeof()的返回类型添加了%zd转换说明,对于strlen()也适用。

3. #define & const👻

  1. #define NAME value表示使用NAME 来代表value。
  2. 注意: #define NAME value末尾没有分号。其中的NAME建议使用全部大写,这是一个好的编程习惯。
  3. #define还可以定义字符和字符串常量
    #define BEEP '\a'
    #define TEA 'T'
    #define ESC '\033'
    #define OOPS 'Hello OKfine!'
  4. const用于限定一个变量为只读。

4. 字符串📌

  1. 字符串(character string)是一个或多个字符序列。
  2. 字符串都被存储在char类型的数组中。数组由连续的存储单元组成,每个单元存储一个字符,每个存储单元为一个字节
  3. 数组的容量必须比字符串的长度大一个字节,最后一个字节用来存储空字符 "\0".
  4. scanf()在读取字符串时(%s),从第一个非空字符开始读取,直到遇见下一个空字符停止。
    例如:输入Hello OKfine, scanf()只会读取完Hello就停止了。

5. “ * ”修饰符✨

  1. printf()函数的 * 修饰符。
    如果你不想预先指定字段宽度,希望通过程序来指定。
    则可以这样使用:printf("%*s\n", length, your_string);
    length就是通过程序计算出来的值,它对应" * ";
    your_string就是你要打印的字符串,对应 s。
    下面第二个小练习就有对应的程序。

6. 8个小练习😀

🐵ONE

  1. 编写一个程序,提示用户输入名和姓,然后以“名,姓”格式打印出来。

设计:
|—首先提示用户输入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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值