C语言从入门到精通之【printf和scanf函数】

printf()是输出函数,scanf()是输入函数,但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。

C语言从入门到精通之【printf和scanf函数】_第1张图片

printf()函数的格式

printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量,甚至是在打印之前先要计算的表达式。格式字符串是双引号括起来的内容

例如:printf(“The %d contestants ate %f berry pies.\n”, number, pies);

注意:格式字符串中的转换说明一定要与后面的每个项相匹配,若忘记这个基本要求会导致严重的后果。

printf()的转换说明修饰符

C语言从入门到精通之【printf和scanf函数】_第2张图片

sizeof运算符以字节为单位返回类型或值的大小。这个大小应该是某种形式的整数,但标准只规定该值是无符号整数。在不同的实现中,它可以是unsigned intunsigned long甚至是unsigned long long。因此,如果要使用printf()函数显示sizeof表达式,根据不同系统可能需要使用%u%lu%llu。这就意味着要查找当前系统的用法,如果将程序移植到不同的系统,可能需要进行修改。

鉴于此,C提供了更好可移植性的类型。首先,stddef.h头文件(在包含stdio.h头文件时已包含其中)将size_t定义为系统使用sizeof返回的类型,这被称为底层类型(underlying type)。其次,printf()使用z修饰符表示打印相应的类型。同样,C还定义了ptrdiff_t类型和t修饰符,用来表示系统使用的两个地址差值的底层有符号整数类型。

C语言从入门到精通之【printf和scanf函数】_第3张图片

float类型

对于浮点类型,有用于double和long double类型的转换说明,却没有float类型的。这是因为在K&R C中,表达式或参数中的float类型值会被自动转换成double类型。printf()函数中所有float类型的参数(对未使用显式原型的所有C函数都有效)仍自动转换成double类型。因此,无论是K&R C还是ANSI C,都没有显示float类型值专用的转换说明。

C语言从入门到精通之【printf和scanf函数】_第4张图片

printf()的返回值

大部分C函数都有一个返回值,这是函数计算并返回给主调程序(calling program)的值,printf()函数也有一个返回值,它返回打印字符的个数。如果有输出错误,printf()则返回一个负值(printf()的旧版本会返回不同的值)。不过该函数的返回值基本不会用到

看这个例子,打印“hello world”返回12(结束符和空格各占1个字节)。

C语言从入门到精通之【printf和scanf函数】_第5张图片

打印长字符串

在一些大公司里,为了方便阅读,代码规范对每一行代码的长度有要求,例如linux内核规定一行不超过80字符,那我们就要换行了。

如下图,如果是逗号后面换行无所谓,如果是双引号内直接换行就会报错

C语言从入门到精通之【printf和scanf函数】_第6张图片

一种方法是**加反斜杠 **,但是这种方法需要顶格,不然会有多余空白。

C语言从入门到精通之【printf和scanf函数】_第7张图片

还有一种方法是拆成多个双引号括起来的字符串。

C语言从入门到精通之【printf和scanf函数】_第8张图片

scanf函数

scanf()中的格式字符串表明字符输入流的目标数据类型

例如:scanf(“%s”, pet);

就是将键盘输入的字符串保存到pet这个变量里,pet是个char类型的数组,字符串格式用%s。

简单记住两条规则:

用scanf()读取基本变量类型的值,在变量名前加上一个&;

用scanf()把字符串读入字符数组中,不要使用&。

&是取址符。

C语言从入门到精通之【printf和scanf函数】_第9张图片

C99标准中常用的转换说明

C语言从入门到精通之【printf和scanf函数】_第10张图片

C语言从入门到精通之【printf和scanf函数】_第11张图片

你可能感兴趣的:(C语言从入门到精通,c语言,开发语言,linux,嵌入式,驱动开发)