1.print
1.1基本用法
printf()的作用是将参数文本输出到屏幕。它的名字里的f代表format(格式化),表示可以定制输出文本的格式。
比如想让屏幕上输出Hello world!printf()不会在行尾自动添加换行符,运行结束光标会停留在输出结束的地方,不会自动换行,为了使输出结束后自动换到下一行,可以在输出文本后添加一个换行符]\n.
下面是加入换行符和不加换行符运行程序后的区别
未加
后加
如果文本内部有换行,也可通过插入换行符实现。例如
上面的程序运行之后
printf()是在标准的头文件stdio.h中定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。(相当于借用别人的东西给人家打招呼)
1.2占位符
printf()可以在输出文本中指定占位符。所谓“占位符”,就是这个位置可以用其他值代入。
例如输出There are 3 apples
上面示例中,There are %d apples\n是输出文本,里面的%d就是占位符,表示这个位置要用其他的值来替换。占位符的第一个字符一律用%,第二个符号表示占位符的类型,%d表示这里带入的值必须是一个整数。
printf()的第二个参数,("There are %d apples",)后面的参数,就是替换占位符的值,上面的例子中整数3替换了,执行后的输出结果就是There are 3 apples.
常用的占位符还有以下:
就拿%s(表示带入的是字符串)再举一例
%s表示带入的是字符串,所以printf()第二个参数就必须是字符串,就是例子中的Zhangsan。执行后的输出就是Zhangsan is a lawyer
输出文本中也可使用多个占位符。
输出结果为
上述中,输出文本%s says it is %d o'clock有两个占位符,第一个是字符串占位符%s,第二个是整数占位符%d,分别对应printf()中的第二个参数(Li Ming)和第三个参数(8),执行后的输出就是Li Ming says it is 8 o'clock。
printf()的占位符与参数是一一对应的,有n个占位符就有n+1个参数。
红色1 2 分别表示的是第一个占位符和第二个占位符
蓝色1 2 3分别表示第一个参数,第二个参数,第三个参数。1.4.1
如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。
1.3占位符列举
printf() 的占位符有许多种类,与 C 语言的数据类型相对应。下面按照字母顺序,列出常用的占位
符,方便查找,具体含义在后面章节介绍。
•%a :十六进制浮点数,字母输出为小写。
•%A :十六进制浮点数,字母输出为大写。
•%c :字符。
•%d :十进制整数。
•%e :使用科学计数法的浮点数,指数部分的 e 为小写。
•%E :使用科学计数法的浮点数,指数部分的 E 为大写。
•%i :整数,基本等同于 %d 。
•%f :小数(包含 float 类型和 double 类型)。
•%g :6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的 e
为小写。
•%G :等同于 %g ,唯⼀的区别是指数部分的 E 为大写。
•%hd :十进制 short int 类型。
•%ho :八进制 short int 类型。
•%hx :十六进制 short int 类型。
•%hu :unsigned short int 类型。
•%ld :十进制 long int 类型。
•%lo :八进制 long int 类型。
•%lx :十六进制 long int 类型。
•%lu :unsigned long int 类型。
•%lld :十进制 long long int 类型。
•%llo :八进制 long long int 类型。
•%llx :十六进制 long long int 类型。
•%llu :unsigned long long int 类型。
•%Le :科学计数法表⽰的 long double 类型浮点数。
•%Lf :long double 类型浮点数。
•%n :已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。
•%o :八进制整数。
•%p :指针。
•%s :字符串。
•%u :无符号整数(unsigned int)。
•%x :十六进制整数。
•%zd : size_t 类型。
•%% :输出⼀个百分号
1.4输出格式
printf()可以定制占位符的输出格式。
1.4.1限定宽度
printf()允许限定占位符的最小宽度。
上面示例中%5d表示这个占位符的最小宽度为5位。如果不满5位对应的值前面就会添加空格。输出的值默认是右对齐,即输出的内容前面会有空格;当然有右对齐就会有左对齐,左对齐就是在输出内容的后面添加空格。可以在占位符%后面添加一个负号。
上面示例中,在123后面添加了空格,为了能看到空格,我在123的后面加了“哈哈”。
对于小数,这个限制符会限制所有小数的最小显示宽度。
上面示例中,%12f表示输出的浮点数最少要占据12位,由于%f默认小数点后打印6位,所以123.45输出结果的前面会添加2个空格。注意小数点也算一位。
1.4.2总是显示正负号
默认情况下,printf()不对正数显示+号,只对负数显示-号,正如我们日常生活中+1写为1而不写+1一样。
如果想让正数也显示+号,可以在占位符%后面加一个+。
上面示例中,%+d确保输出的数值,总是带有正负号。
1.4.3限定小数位数
如果输出小数时,希望小数点后面保留两位,占位符可以写成%.2f
如果希望小数点后面输出3位(0.500),占位符就要写成%.3f。
这种写法遵循四舍五入原则,例如想让0.526小数后保留2位,结果就会显示0.53
当然这种写法还能和限定宽度占位符结合使用。
其中6表示最少打印6位,不够拿空格填入,如果输出文本够6位就不用填入。
最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。
"%*,*f\n,6,2"就相当于"%6.2f\n",两个✳号通过printf()的两个参数传入。
1.4.4输出部分字符串
%s占位符用来输出字符串,默认全部输出。如果只想输出开头的部分,可以用%.【m】s指定输出的长度,其中【m】代表一个数字,表示所输出的长度。
比如helo world中只想输出hello
2.scanf
printf函数为输出,有输出那么就会有输入,输入就是scanf函数.
举个例子:
运行程序
2.1基本用法
scanf()用于读取用户的键盘输入。就是用于添加你想输进去的数据。程序运行到scanf()这个函数值时会停下来等待用户输入。用户输入数据,按下回车键后,scanf()会处理用户的输入数据,将其存为变量。它的原型和printf一样也是定义在头文件stdio.h中。
scanf的语法和printf类似
比如scanf("%d",&i),第一个参数%d,表示用户输入的第一个数为整数,&i表示,将用户从键盘输入的整数存入变量i。
注意:变量前必须加上&运算符(指针变量除外),&是一个取地址符号。因为scanf传递的是地址,而不是具体的值。
如果这些变量都是指针变量(比如字符串变量),就不需要加&。
2.2scanf的返回值
scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有任何项或者匹配失败那么就会返回0。如果成功读取到数据但是数据发生了错误就会返回EOF(-1)。
2.3占位符
scanf() 常用的占位符如下,与 printf() 的占位符基本⼀致。
•%c :字符。
•%d :整数。
•%f : float 类型浮点数。
•%lf : double 类型浮点数。
•%Lf :long double 类型浮点数。
•%s :字符串。
•%[] :在方括号中指定⼀组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停止。
上面所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符(空格)。 %c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表
示跳过零个或多个空白字符。
占位符 %s ,它不能简单地等同于字符串。它的规则是,从当前第⼀个非空白
字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s ⼀起使用,比如英文歌名So Far Away。这也意味着,scanf() 不适合读取可能包含空格的字符串。
scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 。
scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用 %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,字符串超出最大长度,后面的字符将被丢弃。
2.4赋值忽略符
有时候,用户的输入可能不符合预定的格式。
上面的例子中,2023-11-27,就会正确解读出 年 月 日,如果用户输入的是2023/11/27这种格式,scanf ()解析数据就会失败。
那么为了避免这种情况,我们就可以用赋值忽略符(*)。只要把*加在任何占位符的%后面,该占位符就不会返回值,解析后将被丢弃。
输入2023-11-27
输入2023/11/27
这样可以使格式控制灵活,不至于太死板。