printf函数和scanf函数

目录

 

一、printf 函数

1.概念

2.基本用法

2.1换行符

2.2占位符(这个位置可被其他值代入)

2.2.1占位符举例

3.输出格式

3.1限定宽度

3.2.总是显示正负号

3.3.限定小数位数

联系3.1与3.3既限定宽度又限定小数点后位数

3.4.输出部分字符串

二、scanf 函数

1.基本用法

1.2输出多个变量

1.3scanf的返回值

1.4scanf的占位符

1.5赋值忽略符


 

一、printf 函数(输出)

1.概念

按一定格式将文本打印在屏幕上

2.基本用法

#include <stdio.h>
int main()
{
	printf("hello,c");
	return 0;
}

使用peintf()需要引用头文件<stdio.h>

2.1换行符

#include <stdio.h>
int main()
{
	printf("hello,c\n");
	printf("hello\nc\n");
	printf("hello\n");
	printf("c\n");
	return 0;
}

2.2占位符(这个位置可被其他值代入)

#include <stdio.h>
int main()
{
	printf("there are %d apples\n", 3);
	printf("%s will come tonight\n", "zs");
	printf("%s says it is %d o'clock\n ", "zs", 8);
	return 0;
}

注意:占位符第一个字符一律为%,第二个字符表占位符类型 ;一个文本可多个占位符。

2.2.1占位符举例

%c :字符

%d :十进制整数// int

%f:小数(包含float, double类型)//float-- %f double--%lf

%hd:十进制short int 类型

%hu:十进制unsigned short int 类型

%ld:十进制long int 类型

%lu:十进制unsigned long int 类型

%lf:long double 类型浮点数

%p :指针(⽤来打印地址)

%s :字符串

%u :⽆符号整数(unsigned int)

%x :⼗六进制整数

%zd : size_t 类型

3.输出格式

3.1限定宽度

printf ()允许限定占位符的最小宽度

例如:%5d表示这个占位符宽度至少为五

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

d729c4c0c82d4859b99e2dd01222dccb.png

若不满五位,对应值前面会添加空格,输出值默认向右对齐;若希望向左对齐,只需写为%-5d。

对小数:

例如:%12f表输出浮点数最少占据12位

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

f7290886f6e2429693640cfd8689de17.png

由于小数的默认显示精度是小数点后六位,故输出值前有四个空格。

3.2.总是显示正负号

默认下printf(不对正数显示+号,只对负数显示-号。

若想让正数输出+号,可在占位符%加+号。

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

3ed43db27d7648f6969847be4cee4c4b.png

3.3.限定小数位数

例如:%.2指限定小数后面保留两位

int main()
{
    printf("%.3f\n", 1.12);
	return 0;
}

601ec2f9b33c4d079edbc9f82122c993.png

小数点后位数不够就在后面加0,位数超出就四舍五入。

联系3.1与3.3既限定宽度又限定小数点后位数

#include <stdio.h>
int main()
{
	printf("%12.4f\n", 3.14);
	return 0;
}

62beca55b6c545b58043c86d19edff07.png  

最小宽度和小数位数可用*代替 

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

3.4.输出部分字符串

%s表输出字符串,默认全部输出。若要输出开头部分,可用%.ms指定输出的长度,其中m代表一个数字,表所要输出的长度

#include <stdio.h>
int main()
{
	printf("%.5s\n", "hello,c");
	return 0;
}

8ec9680a961f4b8096c8276d8c155892.png

 

二、scanf 函数(输入)

当我们有了变量,需要给变量输入值就可以使用scanf 函数。若需要将变量的值输出在屏幕上的时候,可以使用printf 函数。

注意:在vs中scanf函数不安全,故在使用时需要加入前缀#define_CRT_SECURE_NO_WARNINGS

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 1;
	printf("请输入成绩:");
		scanf("%d", &a);
		printf("你的成绩是%d\n", a);
	return 0;
}

1.基本用法

scanf 函数用于读取用户键盘输入。当程序运行到scanf 会停下来,等待用户输入数据,按下回车键后,scanf 就会处理用户输入,将其存入变量。

1. 1语法与printf 类似

scanf("%d",&i);

注:变量前必须加&运算符

因为scanf 传递的是地址,而不是变量。如果这里的变量是字符串,不用加&。

1.2输出多个变量

scanf("%d%d%f%f", &a, &b, &c, &d);

举例: 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	float c = 0.0;
	float d = 0.0;
	scanf("%d%d%f%f", &a, &b, &c, &d);
	printf("%d\n%d\n%f\n%f\n", a, b, c, d);
	return 0;
}

注:scanf 处理数值占位符时,会自动过滤空白字符,包括空格,制表符,换行符。故用户输入数据间有空格不影响scanf解读。

2233f14f6f8a4855b1d2d482a51331c4.png

另外,用户使用回车键,将输入数据分成几行也不影响解读。

6efab786ddf4472daf253677b47fc023.png

scanf函数处理用户输入的原理:

先将用户输入放入缓存,在等到按下回车键后,按占位符对缓存进行解读。

解读用户输入时,会从上一次解读遗留的第一个字符开始,知道读完缓存或者遇到第一个不符合条件的字符为止。

我们可以看看下面的例子

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 0;
	float b = 0.0;
	scanf("%d%f", &a, &b);//输入-13.45e12#0
	printf("%d\n%f\n", a, b);
	return 0;
}

18513be27c29463e963d4a9f84961d54.png

由于a的类型为int,所以scanf函数解读数据中的-13后停下,在解读遗留下来的数据中的第一个字符,由于b的类型为float,故解读数据为0.45e12后停下来,至于为什么停下来,是因为遇到了不符合b的数据类型的字符#

1.3scanf的返回值

scanf的返回值是一个整数,表示成功读取数据的变量的个数。若无读取任何项或匹配失败,则返回0。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int r=scanf("%d%d%d", &a, &b, &c);
	printf("r=%d\n", r);//打印返回值
	printf("a=%d b=%d c=%d\n", a, b, c);

	return 0;
}

bc773c1dd4fd4b55b8cc2651f0fe1614.png

如果在成功读取任何数据前发生了读取错误或遇到读取到文件结尾,则返回常量(文件结束标点)EOF(-1)。

按ctrl+z 提前结束输入会返回-1

1.4scanf的占位符

%c:字符

%d:整型

%f:浮点型

%lf:double

%Lf:long double

%s:字符串

%[]:在方框中指定一组匹配的字符,遇到不在集合中的字符就会停止

注:1.除%c以外都会忽略空格字符,%c总是返回第一个字符,无论是否为空格

若要强制性跳过,可写成scanf(" %c",&ch);即在%前加空格,表跳过一个或多个空格。

2.%s不能简单等同于字符串,scanf函数中的%s指从第一个非空白字符开始读起,直到遇到下一个空白字符为止。故无法用来读取多个单词,除非多个%s使用。

scanf 函数将字符串读入字符数组时,不会检测字符串是否超过长度。故储存字符串时可能会超出数组的边界。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char arr[5];
	scanf("%s", arr);
	printf("%s", arr);
	return 0;
}

 当我们输入超出长度的字符串,scanf会正常输出字符串并且报错,这就是scanf函数不安全的原因

7e6c3269b6bc40a49d39aeee9d4c7d91.png

d47f1de367a246569fe7c56aac5753f9.png

为了防止这种情况,我们在使用%s时,应指定读入字符串的最长长度,即写成%ms,超出部分会丢弃,就不会有数组溢出的风险。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char arr[5];
	scanf("%4s", arr);
	printf("%s", arr);
	return 0;
}

258f6ccfae434ba9b2deb9aa9862aeba.png

1.5赋值忽略符

有时用户输入不符合预定格式,为了避免,scanf提供了赋值忽略符,把*加在任何占位符的%后面,该占位符就不会返回值,解析后会被忽略。

#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", year, month, day);
	return 0;
}

以上代码用户在使用xxxx-xx-xx才能被读取,若用户输入其他格式如xxxx/xx/xx,就不能被识别,这时使用赋值操作符让其他格式也能被读取。

#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", year, month, day);
	return 0;
}

a9809591cab5489fb7c543e9798bc4a6.png

 

 

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值