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