首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >scanf和printf的用法及其常见错误

scanf和printf的用法及其常见错误

作者头像
用户11935701
发布2025-12-16 08:32:34
发布2025-12-16 08:32:34
2070
举报

printf

printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。

书写方式

在使用printf前需要输入#include <stdio.h>进行声明,printf大致可分为两种书写方式,第一种是直接书写的方法,例如:

代码语言:javascript
复制
#include <stdio.h>
int main() {
	printf("你好");
	return 0;
}

第二种是利用“占位符”的书写方式:

占位符介绍

在上图中%d为“占位符”,所谓 “占位符”,就是这个位置可以⽤其他值代⼊,这个值必需在引号后标明出来。另外这个值的类型必须要和前面的占位符一一对应,详情如下:

• %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 类型浮点数。 比特就业课 比特就业课主页:https://m.cctalk.com/inst/s9yewhfr 比特就业课-专注IT大学生就业的精品课程 • %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。 • %o :⼋进制整数。 • %p :指针。 • %s :字符串。 • %u :⽆符号整数(unsigned int)。 • %x :⼗六进制整数。 • %zd : size_t 类型。 • %% :输出⼀个百分号。

当有多个占位符出现时,后面的数值与前面的占位符的顺序一样的。如:

占位符不仅仅局限于这几种形式,对占位符进行操作我们可以达到更多的效果。

打印带加号的数字

当我们想得到一个带加号的数字时,我们可以使用%+d ,但如果是在数字前加是得不到带加号的数字的,废话不多说直接上图:

但如果我们只是想打印负数的话,直接用负数即可,并不用改变占位符。

限制小数点位数

输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位(正常是6位),占位符可以写成 %.2f 。,数字是几就限定几位。

在这里插入图片描述
在这里插入图片描述
限制宽度

在占位符中我们输入%nd(n为任意整数),可以对输出量进行限制。%nd 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。

最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,输入方式与占位符类似。

输出部分字符串

正常来说在输出字符串时结果是完整的,但是如果我们想限制字符串的长度的话我们可以⽤ %.[n]s 指定输出的⻓度(%s是字符串),其中 [n] 代表⼀个数字,表⽰所要输出的⻓度。

scanf

scanf介绍

scanf函数在代码中是一个相对灵活的函数,通过这个函数我们可以在代码执行过程中改变某个变量的值,例如:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
 int score = 0;
 printf("请输⼊成绩:");
 scanf("%d", &score);
 printf("成绩是:%d\n", score);
 return 0;
}

当代码运行到scanf时会出现停顿,等待你输入一个数据

输入数据后,这个值将会赋给这个变量score,此时再打印score将会打印这个新的值

常用占位符: • %c :字符。 • %d :整数。 • %f :float 类型浮点数。 • %lf :double 类型浮点数。 • %Lf :long double 类型浮点数。 • %s :字符串。

基本用法

scanf和printf用法基本类似,使用前也是需要引用头文件<stdio.h>,它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据。数据类型请参见数据类型详解

代码语言:javascript
复制
int a;
scanf("%d",&a);

与printf语法不同的是需要在变量前加上取地址符号&,这是因为scanf传递的是地址而不是值。

scanf处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf()解读数据。另外,⽤⼾使⽤回⻋键,将输⼊分成⼏⾏,也不影响解读。

常见错误

1.忘加& 当你运行代码时,是可以运行的,并且并没有显示你的代码有问题,也可以正常输入数据,但按下回车时却会跳出这个弹窗

2.变量类型与占位符类型不符 此时将会出现bug,因此在使用前需要仔细了解占位符的使用,以免用错。 例如:

代码语言:javascript
复制
int a;
scanf("%f",&a);

%f是浮点型,而a却是整型,此时的代码就将无法运行,谨记。 3.%d后存在其他无关符号(仅单个%d使用时影响明显) 例如:

代码语言:javascript
复制
	scanf("%d ", &score);
	//或者
	scanf("%d\n", &score);

有一些同学在敲代码时在这里%d后添加了空格或者换行符号,但在运行时却会产生以下bug

我们可以发现在程序中我们居然需要输入两次值,并且最终取值取了第一次的数据,bug虽小但代码一旦长了以后它的影响却是致命的,因此我们要养成正常的敲代码习惯。 其他常见错误等待补充…

赋值忽略符

在上述的错误三中如果想要添加其他无关的符号也是有办法的,这里我们就要用到赋值忽略符‘*’(星号),只要把 * 加在任何占位符的百分号后⾯,表⽰这个占位符没有对应的变量,解读后不必返回,解析后将被丢弃。 例如:

代码语言:javascript
复制
	scanf("%d*   ", &score);
	//或者
	scanf("%d*\n", &score);//即使加个加星号也不会换行
scanf的返回值

scanf的返回值是⼀个整数,表⽰成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF(一般为-1)。

代码语言:javascript
复制
int main()
{
	int a,b,c,d;
	 d=scanf("%d%d%d", &a,&b,&c);
	printf("d=%d",d );
	return 0;
}

如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的d是-1,也就是EOF

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • printf
  • scanf
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档