「printf和scanf:C语言中的输出与输入秘籍」

 先赞后看,不足指正!

这将对我有很大的帮助!

所属专栏: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语言中,printfscanf是两个非常重要的函数。printf用于输出信息到屏幕上,而scanf用于从用户输入中读取信息。下面是阿哇旭总结的一些关于printfscanf的用法。

        那么,话不多说,我们一起来看看吧!


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十六进制整数
%zdsize_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;
}

        printfscanf的用法是十分相似的,需要注意的是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. 结语

        希望这篇文章对大家有所帮助,如果你有任何问题和建议,欢迎在评论区留言,这将对我有很大的帮助。

        完结!咻~

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值