【C语言入门】详细的scanf/printf知识梳理

  相信大家在先前的一篇文章已经浅显的了解过printf的用法,这篇文章将会详细介绍printf(输出)以及scanf(输入)的相关知识。

1. printf函数

  printf函数的功能是把参数文本输出到屏幕。f代表format(格式化),也就是说可以指定输出文本的格式

  

#include<stdio.h>
int main()
{
    printf("Hello C");
    return 0;
}

上面的代码会在屏幕上输出文字“Hello C”。 在这里需要注意,printf函数在运行结束后,不会自动换行,光标在输出结束后就停留在结束的地方,如果需要换行,可以在输出文本的结尾,添加一个换行符 \n ,代码如下:

#include<stdio.h>
int main()
{
    printf("Hello C\n");
    return 0;
}

 或者也可以插入输出一个换行符,代码如下:

#include<stdio.h>
int main()
{
    printf("Hello C");
    printf("\n");
    return 0;
}

\n 是一个转义字符,‘\’转变了字母n本身的含义,在之后会详细介绍各种转义字符。 

1.1 占位符

  所谓占位符,就是这个位置可以用其他类型的值代入。printf函数可以在输出文本里使用占位符。

#include<stdio.h>
int main()
{
    printf("我今年%d岁了",18);
    return 0;
}

  这里会在屏幕上输出“我今年18岁了”。输出文本里的%d就是占位符,在输出的时候,这个位置会被数字‘18’替换。占位符的第1个字符都是%,第2个字符表示占位符的类型,此处的%d就代表这里带入的值为一个整数。

常见的占位符如下:

%d:以十进制形式输出整数(如10)

%c:输出单个字符(如‘a’)

%s:输出字符串(如“abc”)

%f:以浮点数形式输出一个实数(如3.14)

%e:以指数形式输出实数

%p:输出指针的地址

%n:输出已经输出的字符数

1.2 参数

 我们来看下面的代码:

#include<stdio.h>
int main()
{
    printf("%s说我今年%d岁了","lusy",18);
    return 0;
}

此处会在屏幕输出:lusy说我今年18岁了。%s的位置被”lusy“代入,%d的位置被“18”代入。我们称 “%s说我今年%d岁了” 是printf函数的第一个参数 ,“lusy” 是第二个参数,“18” 是第三个参数。printf函数的参数和占位符是一一对应关系,如果有n个占位符,就有n+1个参数。正如上面的代码,有2个占位符%s%d和3个参数。

1.3 输出格式

1.3.1 限定宽度

  printf函数可以限定占位符的最小宽度,比如下面的代码:

#include<stdio.h>
int main()
{
    printf("%4d",18);
    return 0;
}

这个例子中,%4d表示这个占位符的宽度至少为四位,如果不满四位,会在对应值的前面补上相应的空格。

由于18占了两位,少于四位,所以在18的前面补上了两个空格。由此可见,printf输出的值默认是右对齐的 。如果需要左对齐,可以在占位符%的后面添加一个负号,代码及运行结果如下:

#include<stdio.h>
int main()
{
    printf("%-4d", 18);
    return 0;
}

在这里%4d指的是最小宽度为四位,等于或者高于四位的可以正常输出,代码如下:

#include<stdio.h>
int main()
{
    printf("%4d", 10086);
    return 0;
}

1.3.2 限定小数位数 

对于小数来说,这种格式的占位符会限制所有数字的最小宽度(小数点也算作一位) ,代码如下:

#include<stdio.h>
int main()
{
    printf("%4f", 3.1);
    return 0;
}

 这里之所以没有输出3.1,是因为小数的默认精度是小数点后6位,我们把%4f改成%12f来看看

#include<stdio.h>
int main()
{
    printf("%12f", 3.1);
    return 0;
}

  

在这里整数部分加上小数点再加上小数部分一共是8位,但是我们规定最小输出宽度为12位,所以在最前面补上了4个空格。

如果我们想保留小数点后n位数字,可以把%12f换成%12.nf的形式,代码如下:

#include<stdio.h>
int main()
{
	printf("%12.2f", 3.1);
	return 0;
}

这样就会保留小数点后2位小数,同时控制总位数为12。如图,小数部分共4位,在前面补上8个空格。如果想要进行左对齐的话,可以在占位符%的后面添加一个负号。

最小宽度和小数位数这两个限定值,都可以用*代替,通过printf的参数传入,代码如下:

#include<stdio.h>
int main()
{
	printf("%*.*f\n", 3,2,3.1);
	return 0;
}

 上面的示例中,%*.*的两个星号通过printf的两个参数3和2传入。

1.3.3 输出部分字符串

在输出字符串时,也可以通过%.ms来控制输出的长度,代码如下;

#include<stdio.h>
int main()
{
	printf("%s", "hello");

	return 0;
}

我们把%s改成%.ms的形式:

#include<stdio.h>
int main()
{
	printf("%.3s", "hello");

	return 0;
}

 这样只会输出前三个字符。

总结:

1.对于小数 %m.n 的形式,m表示控制输出的最小位数,n则表示控制保留小数点后几位。

2.对于整数%m 的形式,m表示控制输出的最小位数。

3.对于字符串%.ms的形式,m表示控制输出字符串的前m位。

1.3.4 显示正负号

  默认情况下,printf不对正数显示正号,只对负数显示负号,如果想要让正数也输出正号,可以在占位符%的后面加一个‘+’。

#include<stdio.h>
int main()
{
	printf("%d\n", 3);
	printf("%d", -6);
	return 0;
}

 我们在占位符%的后面加一个‘+’。

#include<stdio.h>
int main()
{
	printf("%+d\n", 3);
	printf("%d", -6);
	return 0;
}

 这样正数也可以输出正号了。

1.4 printf的返回值

  printf的返回值取决于输出的内容中有多少个字符,代码如下:

#include<stdio.h>
int main()
{
	int a=10;
	printf("返回值为%d", printf("%d\n", a));
}

 

外部的printf函数会先执行内部的printf函数,输出10并换行,然而因为10有‘1’,‘0两个字符,外加‘\n’换行符,一共三个字符,所以内部printf函数的返回值为3。 

2.scanf函数

  scanf函数用于读取用户的键盘输入。程序读到这里时,会暂时停下来,等待用户的输入。用户输入完毕后,按下回车,scanf函数就会处理用户输入的数据,将其存入变量中。

在C语言中,变量是用来存储数据的容器。它们通常用来编写程序,以便在运行时储存和操作数据。

 scanf的用法类似于printf,最主要的区别在于,printf中占位符所被替换掉的是数据,而scanf中占位符所被替换掉的是数据的地址。(此处a为一个整型变量)

#include<stdio.h>
int main()
{
	int a;
	scanf("%d", &a);
	printf("%d",a);

	return 0;
}

scanf中的“ &”叫做取地址符,表示将用户输入的数据存储到a的地址中。如上图所示,5这个整型数据被存入到a的地址中,这样输出a的值就是5。

2.1 输入格式

 scanf在存入多个数据时,如果占位符与占位符中间没有字符间隔,在输入时,可以用空格、回车、Tab键作为两个输入数据之间的分隔标志。

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d%d", &a,&b);
	printf("%d %d",a,b);

	return 0;
}

但是如果scanf的占位符与占位符中间有字符间隔,如逗号,输入时就需与scanf格式化的内容一一对应

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d,%d", &a,&b);
	printf("%d %d",a,b);

	return 0;
}

不然就会出错。

2.2 关于scanf输入时的小细节

2.2.1 关于%c

  需要注意的是,在scanf读入数据时,除了%c以外,都会忽略起首的空格。

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d", &b);
	printf("%d ",b);

	return 0;
}

在这里%d忽略了整型数据5之前的8个空格,成功读入。

#include<stdio.h>
int main()
{
	char b;
	scanf("%c", &b);
	printf("%c",b);

	return 0;
}

如果数据前没有空格,会成功读入。

但是如果数据前有空格,就会读入失败,原因是空格也算作一个字符,为了方便观察,在输出时的占位符后填上两个x,方便观察输出的空格。如下:占位符的空格正常输出,两个x正常输出。

如果想要解决这个问题,只需要在占位符%的前面添加一个空格就可以。

#include<stdio.h>
int main()
{
	char b;
	scanf(" %c", &b);
	printf("%c",b);

	return 0;
}

这样问题就解决了。 

2.2.2 关于%s

  %s的规则是,从当前第一个非空白字符开始读起,直到遇到空格、回车、Tab键为止。所以它不会读取空白字符。如果输入多个单词之间有空格的情况,只能用多个%s读取。如果要解决这个问题,可以使用一个新的函数 gets,这个函数会读取整个字符串,包含空白字符,直到遇到换行符或者文件结束符为止。

#include<stdio.h>
int main()
{
	char b[10];

	gets(b);
	printf("%s",b);

	return 0;
}

b[10]是一个数组,涉及到字符串相关的知识,此处不多介绍。

2.3 scanf的返回值

  scanf的返回值是一个整型,表示成功读取的变量个数,如果没有读到数据,或者占位符的类型与输入的数据类型匹配失败,就会返回0,如果遇到文件的末尾(END OF FILE)就会返回EOF,表示-1。

#include<stdio.h>
int main()
{
	int a,b,ret;
	ret=scanf("%d%d", &a,&b);
	printf("返回值为%d ",ret);

	return 0;
}

如上图,成功读取两个数据,返回1。 

需要注意的是如果第一个读取失败则不会读取接下来的数据,返回0。

如果输入Ctrl+z(vs2022需要输入三次)就会返回EOF,值为-1。

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Celia~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值