先赞后看,不足指正!
这将对我有很大的帮助!
所属专栏:C语言知识
阿哇旭的主页:Awas-Home page
目录
引言
在C语言中,printf
和scanf
是两个非常重要的函数。printf
用于输出信息到屏幕上,而scanf
用于从用户输入中读取信息。下面是阿哇旭总结的一些关于printf
和scanf
的用法。
那么,话不多说,我们一起来看看吧!
1. printf函数
1.1 基本用法
printf
函数用于将指定的信息输出到屏幕上。它名字里面的 f
代表format
(格式化),表示可以定制输出文本的格式。
基本用法如下:
printf("格式化字符串", 参数列表);
示例代码:
#include<stdio.h>
int main()
{
printf("Hello,World!\n"); /*为了让光标移到下⼀⾏的开头,
return 0; 可以在输出⽂本的结尾,
} 添加⼀个换⾏符 \n*/
printf
函数是在标准库的头文件 stdio.h 定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。
1.2 占位符
printf
函数可以在输出文本中指定占位符。
代码示例:
// 输出 There are 3 apples
#include<stdio.h>
int main()
{
int count = 3;
printf("There are %d apples\n",count);
return 0;
}
// 输出 阿哇旭 在写博客~
#include<stdio.h>
int main()
{
char name[10] = "阿哇旭";
printf("%s 在写博客~", name);
return 0;
}
在printf
函数中,格式化字符串用于指定输出的格式。常见的格式化选项如下表所示:
占位符 | 含义 |
%a | 十六进制浮点数,字母输出为小写 |
%A | 十六进制浮点数,字母输出为大写 |
%c | 字符 |
%d | 十进制整数 |
%e | 使用科学计数法的浮点数,指数部分的 e 为小写 |
%E | 使用科学计数法的浮点数,指数部分的 E 为小写 |
%i | 整数,基本等同于 %d |
%f | 小数(包含 float 类型和 double 类型) |
%o | 八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号整数(unsigned int) |
%x | 十六进制整数 |
%zd | size_t 类型 |
%% | 输出一个百分号 |
常见的打印输出:
#include<stdio.h>
int main()
{
printf("%d\n", 4); // 打印整数
printf("%c\n", 'w'); // 打印字符
printf("%s\n", "a-wax"); // 打印字符串
printf("%f\n", 1.4f); // 打印单精度浮点数
//由于1.4默认为是double类型,加上f变成float类型
printf("%lf\n", 1.44); // 打印双精度浮点数
return 0;
}
1.3 字符串的打印
具体有两种打印字符串的方法。
代码示例:
#include<stdio.h>
int main()
{
printf("Hello,World!\n");
printf("%s","Hello,World!");
return 0;
}
1.4 限定格式
(1)限定宽度
%s 占位符用来输出字符串,默认是全部输出。如果只想输出开头的部分,可以用 %.[m]s 指定输出的长度,其中 [m] 代表⼀个数字,表示所要输出的长度。
代码示例:
#include<stdio.h>
int main()
{
printf("%9d\n",12345);
printf("%d", 123456789);;
return 0;
}
%9d 表示这个占位符的宽度示少为9位。如果不满9位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入一个 - 号。
代码示例:
#include<stdio.h>
int main()
{
printf("%-9d\n",12345);
printf("%d\n", 123456789);
return 0;
}
对于小数,这个限定符会限制所有数字的最小显示宽度。
代码示例:
// " 3.141500"
#include<stdio.h>
int main()
{
printf("%12f\n", 123.45);
return 0;
}
由于小数的默认显示精度是小数点后6位, 所以 123.45 输出结果的头部会添加2个空格。
(2)总是显示正负号
%+d 可以确保输出的数值,总是带有正负号。
代码示例:
#include<stdio.h>
int main()
{
printf("%+d\n", 12);
printf("%+d\n", -12);
return 0;
}
(3)限定小数位数
在VS编译器中,小数的默认显示精度是小数点后6位,比如,想要小数点后面只保留n位,占位符可以写成 %.nf ,也可配合限定宽度占位符使用。
代码示例:
#include<stdio.h>
int main()
{
printf("%.5f\n", 0.14);
printf("%8.5f\n", 0.14);
return 0;
}
(4)输出部分字符串
%s 占位符用来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.ns 指定输出的长度,占位符可以写成 %.ns。
代码示例:
#include<stdio.h>
int main()
{
printf("%.5s\n", "hello world");
printf("hello world");
return 0;
}
2. scanf函数
2.1 基本用法
scanf
函数用于读取用户的键盘输入,程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据、按下回车键后, scanf
就会处理用户的输入,将其存入变量。
代码示例:
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d", &a, &b);
printf("%d %d", a, b);
return 0;
}
printf
和scanf
的用法是十分相似的,需要注意的是scanf
的参数部分传递的是地址,而且输入内容要与格式化的内容一致。
例如,我们在格式化内容的两个%d之间加入',',会发生什么呢!
代码示例:
#include <stdio.h>
int main()
{
int a, b;
scanf("%d,%d", &a, &b);
printf("%d %d", a, b);
}
对比上面的两个输入内容,我们可以知道,scanf
的输入内容要与格式化内容一致,不然就会出现错误。
2.2 scanf的占位符
scanf
的占位符与printf
的占位符基本一致。
需要注意的是,除了 %c 外,都会自动忽略起首的空白字符。%c 不忽略空白字符,总是返 回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写为:
scanf(" %c", &ch); //即 %c 前加上⼀个空格,表示跳过零个或多个空⽩字符
还有就是占位符 %s,它不能简单地等同于字符串。它的规则是,从当前第⼀个非空白字符开始读起,直到遇到空字符(即空格、换行符、制表符等)为止。
因为 %s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s 一起使用。这也意味着, scanf
不适合读取可能包含空格的字符串,比如书名或歌曲名。另外, scanf
遇到 %s 占位符,会在字符串变量末尾存储一个空字符'\0' 。
scanf
将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防止这种情况,使用 %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
代码示例:
#include<stdio.h>
int main()
{
int name[14];
scanf("%13s", name);
printf("%s", name);
return 0;
}
由上图可知,name 是一个长度为14的字符数组,scanf
的占位符 %13s 表示最多读取用户输入的13个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。
2.3 scanf的返回值
(1)scanf返回值的介绍
scanf
的返回值是一个整数,表示成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾(END OF FILE),则返回常量 EOF,表示-1。
如果输入一个数后,按 Ctrl+z ,提前结束输入。
在VS编译器中,Ctrl+z重复输入三次会自动跳到文件的末尾, 对于其他编译器输入一次即可。
(2)scanf返回值使用
我们还可以利用scanf
的返回值来进行多组数据的输入,也可以用于一些刷题项目中。
示例代码:
// 计算两个数的和
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int sum = 0;
while (scanf("%d%d", &a, &b) != EOF)
{
sum = a + b;
printf("总和sum=%d", sum);
}
return 0;
}
2.4 赋值忽略符
有时,用户的输入可能不符合预定的格式。
代码示例:
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
在上面示例中,用户的输入内容与格式化内容不相一致,此时,scanf
解析数据失败。
那么该如何避免这种情况呢!scanf
提供了一个赋值忽略符 * 。
代码示例:
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
3. 结语
希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。
完结!咻~