C Primer Plus 学习笔记 第4章 字符串和格式化输入/输出

暑假期间继续写博客,写完了往后学。

全书共分17章,这是关于本书第4章内容的博客,本章主要介绍了printf()和scanf()函数,也有一些其他内容。本章细节的地方也比较多,不要太陷进去。博客的目录和书上目录是相似的。此系列博客的代码都在Visual Studio 2022环境下编译运行。

我目前大一刚刚结束,水平有限,博客中若有错误或者总结不到位的地方也请见谅。

目录

4.1 字符串简介

4.1.1 char类型数组和null字符

4.1.2 使用字符串

4.1.3 strlen()函数

4.2 常量和C预处理器

4.2.1 const限定符

4.2.2 明示常量

4.3 printf()和scanf()

4.3.1 printf()函数

4.3.2 使用printf()

4.3.3 printf()的转换说明修饰符

4.3.4 转换说明的意义

4.3.5 使用scanf()

4.3.6 printf()和scanf()的*修饰符

4.3.7 printf()的用法提示


4.1 字符串简介

本部分知识后面第11章会详细介绍。

4.1.1 char类型数组和null字符

字符串是一个或多个字符的序列,要用双引号括起来,双引号不是字符串的一部分,作用是告诉编译器括起来的内容是字符串。

C语言没有专门存储字符串的变量类型,一般将字符串存储在char类型数组中。数组由连续的存储单元组成,是同类型数据元素的有序序列,这部分详细内容在第10章。定义数组时,名称后面的方括号[]表示这是一个数组,里面的数字表明元素数量。

\0是空字符,在C语言中用于标记字符串的结束。空字符是非打印字符,ASCII码值为0。

4.1.2 使用字符串

%s输出字符串。

在读取输入时,scanf()函数已经将空字符放入字符串结尾,scanf()函数读取字符串在遇到空格时停止。字符串常量结尾也不用写空字符,编译器会在末尾加上空字符。

4.1.3 strlen()函数

strlen()函数给出字符串的字符长度(不包括空字符)。

头文件string.h包含了很多与字符串相关的函数原型,包括strlen()。一般地,C语言把函数库相关的函数归为一类,为每类函数提供头文件。例如,printf()和scanf()函数的原型在stdio.h中。

很长的printf()语句可以在参数之间断为两行,但不要在字符串之间断开。

sizeof后面是否使用圆括号取决于运算对象是类型还是特定量,是类型时圆括号必不可少,对特定量可有可无,但最好都使用圆括号。

4.2 常量和C预处理器

有些常量在程序中多次使用,这种情况下使用符号常量更好。因为常量名表达的信息更多更清楚,

另外如果要修改值的情况下也很方便。

创建符号常量可以使用一个变量,然后将值设置为一个常量。但是程序可能无意改变值。C语言中还可以使用#define语句创建一个明示常量。通用格式为

#define NAME value

名称最好用大写,可以提高程序的可读性,与变量区分。命名规则和变量相同。末尾不用加分号,也不用使用等号连接。在编译程序时,所有出现符号常量名的地方会被替换为后面的内容,在运行时已替换完成。

4.2.1 const限定符

const关键字限定一个变量为只读(但还是变量,不是常量)。使用时在类型前加上const。使用后该变量的值不可修改。

4.2.2 明示常量

C语言的头文件limits.hfloat.h提供了与整数和浮点数类型大小限制相关的信息,这两个头文件提供很多相关明示常量。

6759fe6a588f40fa8e3b5473266fefa7.jpg26a91084142a4e38acfeee1da49499a7.jpg55de34d6c5a244afb8b3d6a1e2a2da70.jpg

把FLT替换为DBL和LDBL表示double和long double型对应明示常量。

4.3 printf()和scanf()

printf()和scanf()函数能让用户与程序交流,属于输出/输入函数,或I/O函数。C库中的所有函数都不是C语言定义的一部分,由具体编译器实现,标准提供了标准版本。

printf()和scanf()函数工作原理几乎相同,都使用格式字符串和参数列表。

4.3.1 printf()函数

C语言由转换说明指定如何把数据转换为可显示的形式。

d152cdb650b54e9a8491ffbae23a8d48.jpgbb509c9ee135450ea363318ada707699.jpg

4.3.2 使用printf()

printf()函数的格式是printf(格式字符串,待输出项1,待输出项2...)

待输出项可以是变量,常量或表达式的值。格式字符串包括实际要输出的字符和转换说明。转换说明的类型数量一定要与后面的项一一匹配,否则可能会导致严重后果。

如果只输出文字,就不需要转换声明,如果只输出数据,也不需要在格式字符串中加入说明文字。输出%需要格式字符串中对应位置有两个相邻的%。

4.3.3 printf()的转换说明修饰符

在%和转换字符之间插入修饰符可以修饰基本的转换说明。如果要插入多个字符,其顺序应该与下表的顺序相同。

27ef4efd29dd41b7beaf04321afec108.jpg80d340dd470f46c1b8bf0c5e383235a3.jpg

stddef.h头文件(包含stdio.h头文件就已包含)中定义sizeof返回的类型为size_t类型,被称为底层类型。在printf()中用z修饰符表示输出此类型。C语言定义ptrdiff_t类型和t修饰符表示系统两个地址差值。

aa43c8a6c1244a6494d781e00ed08b45.jpg548b4d5a945544ecaad6dbc46f42e5ac.jpg

4.3.4 转换说明的意义

转换说明把以二进制格式存储在计算机中的值转换为一系列字符以便于显示。

printf()函数也有返回值,返回打印字符的个数,如果有输出错误则返回一个负值,通常很少用到。

在字符串中可以使用\n表示换行字符,但是不能通过按Enter产生实际的换行符。

给字符串断行可以使用多个printf()语句,可以用\和Enter断行(但下一行必须从最左端开始,最左端不能有空格,否则字符串会包括空格),也可以将两个双引号括起来的字符串用空白隔开。

4.3.5 使用scanf()

scanf()把输入的字符转换为对应的格式。scanf()也使用格式字符串和参数列表,格式字符串表明字符输入流的目标数据类型。scanf()的参数列表中使用指向变量的指针(第10章详细介绍指针,读取基本变量类型的类型值要在变量名前加&)。

scanf()函数使用空白(换行符、制表符和空格)把输入分为多个字段,在依次把转换说明和字段匹配时跳过空白。但是使用%c转换说明时,scanf()会读取空白。

scanf()的转换说明和printf()几乎相同。但是printf()函数对float和double类型的转换说明相同,但scanf()函数只将其用于float类型,要对double类型使用l修饰符。

6cb7ff5ccfc743d599ed580f21aab891.jpgscanf()函数也可以在转换说明中使用修饰符。

c640ac86bd464afcbc5fe1bfc8bdde0b.jpg4eb25f916e424bd7bfd9c6ba1dccf2a5.jpg

如果读取的字符不能用于转换声明要求的类型,字符会被放回缓冲区中,同时停止读取。如果首个非空白字符不能用于转换声明要求,则不进行赋值。使用带有多个转换说明的scanf(),会在第一个出错处停止读取输入。使用%s转换说明会读取除空白外所有字符。

scanf()函数允许把普通字符放在格式字符串中,此时除空格字符外的普通字符必须与输入严格保持一致。格式字符串的空白意味着跳过下一个输入项前面的所有空白。除了%c,其他转换说明都自动跳过输入值前面的空白。

scanf()函数返回成功读取的项数。检测到文件结尾时会返回EOF。

4.3.6 printf()和scanf()的*修饰符

printf()和scanf()都可以使用*修饰符来修改转换说明的含义。

printf()函数中,可以用*修饰符代替字段宽度,但是需要在待输出项前面加一个参数表示字段宽度。

scanf()函数中使用*会跳过相应的输入项。

4.3.7 printf()的用法提示

想把数据打印成列,可以指定字段宽度。使用足够大的固定字段宽度可以使输出整齐美观。

在两个转换说明中间插入一个空白字符,可以防止两个数据内容相连。

要在文字中嵌入数字,通常指定小于等于该数字宽度的字段。

C语言可以选择特定的本地化设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第七主要介绍了C语言中的函数,包括函数的定义、调用、参数传递、返回值等方面的内容。具体内容包括: 1. 函数的定义和调用:介绍了如何定义函数以及如何调用函数,包括函数的返回类型、函数名、参数列表和函数体等。 2. 函数参数传递:介绍了C语言中的参数传递方式,包括值传递和地址传递,以及如何在函数中使用参数。 3. 函数的返回值:介绍了函数的返回值类型和返回值的作用,以及如何在函数中使用返回值。 4. 函数的声明和定义:介绍了函数的声明和定义的区别,以及如何在不同的文件中使用函数。 5. 函数的递归:介绍了递归函数的概念和使用方法,以及递归函数的优缺点。 6. 函数指针:介绍了函数指针的概念和使用方法,以及如何在程序中使用函数指针。 总的来说,第七C语言中非常重要的一,对于理解和使用函数有很大的帮助。 ### 回答2: 《C Primer Plus》第六版第七主要介绍了C语言中的输入输出函数。这的内容包括标准I/O库、`printf()`、`scanf()`等函数以及文件输入输出等。 在这一中,首先讲解了如何使用标准I/O库进行输入输出。标准I/O库提供了一组函数,可以用于从键盘读取输入,或将结果输出到屏幕上。`printf()`函数可以用于格式化输出,可以控制输出格式,比如输出特定长度的整数、浮点数等。`scanf()`函数可以用于从键盘读取输入,并将其存储到变量中,也可以使用特定的格式来读取特定类型的数据。 接下来,讲解了如何使用`getchar()`和`putchar()`函数。`getchar()`函数用于从键盘读取单个字符,`putchar()`函数用于向屏幕输出单个字符。 此外,还介绍了文件的输入输出。通过使用`fopen()`函数打开文件,可以读取或写入文件的内容。使用`fprintf()`函数可以将数据写入文件中,使用`fscanf()`函数可以从文件中读取数据并存储到变量中。同时还介绍了如何使用`fclose()`函数关闭文件。 最后,本还讲解了格式化输出的一些高级特性,比如控制字段宽度、对齐方式以及使用转换说明符等。 通过学习《C Primer Plus》第六版第七,我们能够了解C语言输入输出的基本概念和原理,掌握使用输入输出函数进行读写操作的方法,以及如何进行文件的读写操作。这对于日后编写C语言程序以及处理文件输入输出都有着重要的作用。 ### 回答3: C Primer Plus第六版第七主要介绍了C语言中的函数函数是一段完成特定任务的可重复使用的代码块,它可以接收输入参数并返回一个值。 在这一中,我们学习了如何定义函数并明确函数的返回类型、函数名和参数列表。通过使用函数,我们可以将程序中的代码划分为更小、更可管理的部分。函数的主要好处之一是提高了代码的可读性和可维护性。 我们还学习了传递参数的不同方式,包括按值传递、按地址传递以及传递指针。这些方法允许我们在函数之间传递数据,并在函数内部对数据进行修改。 此外,我们还研究了递归函数的概念。递归函数是指可以调用自身的函数。使用递归可以通过将问题划分为更小的子问题来解决复杂的问题。 在这一中,我们还学习函数的作用域和生命周期。函数的作用域定义了函数内部和外部变量的可见性。函数的生命周期指的是函数在程序运行期间的保持状态的时间。 最后,我们还讨论了函数的多文件组织和调用。通过将函数定义和函数声明分离到不同的文件中,我们可以更好地组织和管理大型项目的代码。 通过学习C Primer Plus第六版第七,我们可以更好地理解和应用函数C语言中的重要性。掌握函数的知识将有助于我们编写更模块化、可读性更强、可维护性更高的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值