当前位置:网站首页>3.输入和输出函数(printf、scanf、getchar和putchar)
3.输入和输出函数(printf、scanf、getchar和putchar)
2022-07-06 09:20:00 【是王久久阿】
目录
在C语言中,scanf和printf是输入和输出函数,在使用这两个函数时,需要指定输入数据的格式,根据不同类型的数据来指定不同的格式。
printf函数
printf函数的一般格式
printf("格式控制",输出列表)
格式控制:由双引号所引起来的一个字符串,包含两个信息——格式声明和普通字符。
- 格式声明:由%和格式字符组成,例如%d,%c,%s等。
- 普通字符:普通字符即在输出的时候保持原有的样子。
输出列表:需要输出的数据,可以是常量、变量、或者是表达式。
有时为了输出美观,会在格式控制里增加一些转义字符,例如在末尾加入换行符。
利用printf函数输出多个变量时,格式声明的顺序要和输出列表的顺序保持一致。
#include<stdio.h>
int main()
{
int a = 10;//整型
double b = 2.0;//双精度
float c = 2.0f;//单精度,输入单精度时,要在末尾加上f,否则编译器会默认为double类型
printf("a=%d,b=%lf,c=%f\n", a,b,c);//输出多个变量时,格式声明的顺序要和输出列表的顺序一致
return 0;
}
当输出列表是表达式时,尽量做到表达式简洁,不要过度嵌套使用。
int sum(int x,int y)
{
return x + y;
}
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("sum=%d\n",a+b);
printf("sum=%d\n", sum(a, b));//表达式的形式多种多样,可以自行试验
return 0;
}
格式字符
在输出时,对不同类型的数据要指定不同的格式声明。
格式声明的一般形式可以表示为:% 附加字符 格式字符
(例:%5d表示域宽为5的整数;%.2f为保留小数后两位小数)
注:附加字符可以不显示,但是%和格式字符是必须的。
格式字符 | 说明 |
---|---|
d | 输出带符号的十进制整数 |
ld | 输出带符号的十进制整数(长整型) |
u | 输出无符号的十进制整数 |
c | 输出一个字符 |
s | 输出字符串 |
f | 以小数形式输出,单精度 |
lf | 以小数形式输出,双精度 |
p | 地址 |
g | 以小数形式输出时,不输出无意义的0 |
e,E | 以指数形式输出实数。 用e时表示(1.2e+02) 用E时表示(1.2E+02) |
o | 以八进制无符号形式输出整数 |
x,X | 以十六进制无符号形式输出整数 用x时以小写字母输出; 用X时以大写字母输出。 |
字符 | 说明 |
l | 用于长整型整数、双精度小数,可加在格式符d、o、x、u、f前面 |
m | m表示为数据最小宽度(m为一个正整数) |
.n | 对实数,.n为表示输出n位小数 对字符串,.n为表示截取的字符个数(n为一个正整数) |
- | 输出的数字或字符在域内左对齐 |
注意事项
1、printf函数输出时,输出的对象与对应类型必须匹配。
2、除特定格式字符外,其他格式字符必须使用小写。
3、在printf函数的“格式控制字符串”中可以加入转义字符。
4、格式字符以%为开头,以上述中格式字符之一为结束。
5、如果想输出%,应该在“格式控制字符串”中连续使用两个“%”表示。
例如:printf("%d%%",10);输出结果为10%
6、如果想输出的内容与转义字符混淆,在转义字符前加入\即可。
例如:如何输出一个\n呢?答:printf("\\n");
7、printf函数是有返回值的,他的返回类型是整型,大小为打印内容的个数。
scanf函数
scanf函数的一般格式
scanf(格式控制,地址表列)
格式控制:含义同printf函数。
地址表列:是由若干个地址组成的表列,可以是变量、字符串的首地址。
地址表列的一般形式为& 参数名称,这里&为取地址符号。
例如:int a = 0;
scanf("%d",&a);
注意事项
(1)scanf函数根据格式控制字符串的格式不同,所对应的输入方式也不同,并且scanf的格式控制中,不要随意加入转义字符,会导致输入出错。
例如:
int main()
{
int a = 0, b = 0, c = 0;
//假设我们想输入a=10,b=20,c=30
scanf("a=%d,b=%d,c=%d", &a, &b, &c);//a=10,b=20,c=30
printf("a=%d,b=%d,c=%d\n", a, b, c);
printf("--------------\n");
scanf("%d,%d,%d", &a, &b, &c);//10 20 30(每个数字之间用,隔开)
printf("a=%d,b=%d,c=%d\n", a, b, c);
printf("--------------\n");
scanf("%d%d%d", &a, &b, &c);//10 20 30(每个数字之间用空格或者回车隔开)
printf("a=%d,b=%d,c=%d\n", a, b, c);
return 0;
}
(2)输入数值时,两个数值之间需要插入空格或者回车,以使系统能够区分两个数值。但是在连续输入字符时,不要插入空格或其他分隔符,系统能够区分两个字符。
例如:
#include<stdio.h>
int main()
{
char c1 = { 0 };
char c2 = { 0 };
char c3 = { 0 };
scanf("%c%c%c", &c1, &c2, &c3);//连着输入abc三个字符,按回车结束
printf("正确结果为:%c%c%c\n", c1, c2, c3);
printf("------\n");
getchar();//从缓冲区拿走一个字符
scanf("%c%c%c", &c1, &c2, &c3);//输入abc三个字符,每个字符之间用空格隔开
printf("错误的结果为:%c%c%c\n", c1, c2, c3);//err
return 0;
}
按F10进入调试,打开监视面板,对c1、c2、c3进行监视。
发现c1被赋值为‘a’,c2被赋值被‘ ’,c3被赋值为‘b’。在输入连续字符时,切勿加空格。
(3)在输入数值数据时,输入不属于数值的字符(例如:空格、回车、Tab等),认为数据结束。
#include<stdio.h>
int main()
{
int a = 0;
char b = { 0 };
float c = 0.0f;
scanf("%d%c%f", &a, &b, &c);
printf("a=%d b=%c c=%f\n", a,b,c);
return 0;
}
假设输入1234z78 .23,第一个整型数值读取1234,到‘z’时发现是非数值字符便停止了;第二个字符正好读走一个‘z’;第三个浮点型数值读取78,到‘ ’时发现是非数值字符停止读取。
(4)用scanf函数输入一个数组
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for(i = 0; i < 10;i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
return 0;
}
在编译器中,数组的下标是从0开始的,即第一个元素的下标为0,第二个元素下标为1.......第十个元素下标为9。这里对于数组的输入我们可以用for循环遍历输入,每次输入数组的一个元素,直到整个数组都输入完为止,数组的打印也是同理。
注:当数组为一个字符串时,可以直接输入、输出,并且因为数组名即数组的地址,所以调用scanf时不用加&符号。
例如:
#include<stdio.h>
int main()
{
char arr[10] = { 0 };
scanf("%s", arr);
printf("%s", arr);
return 0;
}
getchar函数和putchar函数
除了printf和scanf输出和输入字符外,C语言的库函数中还有专门用来输入和输出字符的函数。
getchar函数的一般格式
getchar函数的作用是从缓冲区获取一个字符,它的返回类型是整型。
getchar函数(字符输入函数)的一般形式为:getchar()
注:getchar函数的返回类型是整型,当getchar读取结束或者读取失败后会返回EOF,EOF的大小实际上是-1,所以需要创建一个整型变量来接收getchar。
putchar函数的一般格式
putchar函数的作用是向显示器输出一个字符,它的返回类型的整型。
putchar函数(字符输出函数)的一般形式为:putchar(a)(意思为输出变量a的字符)
注:putchar(a)中的a可以是字符常量、整型常量、字符变量或整型变量(其值在字符的ASCII代码范围内)
getchar函数的使用
主要用来清理缓冲区。
scanf和getchar函数都是从缓冲区里读取数据,把刚刚讲scanf的代码拿过来,比如我们想输入3个字符,分别是‘a’、‘b’、‘c’,当我们输入完abc后,scanf并不能读取到,还需要我们敲一下回车键,数据进去缓冲区后,scanf才能读取到。
#include<stdio.h>
int main()
{
char c1 = { 0 };
char c2 = { 0 };
char c3 = { 0 };
scanf("%c%c%c", &c1, &c2, &c3);//连着输入abc三个字符,按回车结束
printf("正确结果为:%c%c%c\n", c1, c2, c3);
printf("------\n");
getchar();//从缓冲区拿走一个字符
scanf("%c%c%c", &c1, &c2, &c3);//输入abc三个字符,每个字符之间用空格隔开
printf("错误的结果为:%c%c%c\n", c1, c2, c3);//err
return 0;
}
在缓冲区中,除了我们想要的abc,还有我们敲回车键留下的\n,如果只进行一次数据输入并不会有任何影响。但是如果我们想连着输入两个数呢?假设我第二次想输入‘d’、‘e’、‘f’。第二个scanf首先会读取到缓冲区中留下的\n。
这时,第二个scanf首先会读取到前面留下来的\n,然后是de。想要解决掉这问题,只需要两次scanf之间加入getchar(),把换行符拿走即可。
然而,gerchar()每次只能拿走一个字符,如果需要拿走多个字符呢?
while ((ch = getchar()) != '\n')//清理缓冲区
{
}
while循环一直利用getchar读取字符,直到读取到\n时,缓冲区清理完毕。
例如:
做一个简易的密码输入程序
#include<stdio.h>
int main()
{
char arr[10] = { 0 };
printf("请输入密码:>");
scanf("%s", arr);
int ch = 0;
while ((ch = getchar()) != '\n')//一直用getchar读取缓冲区内的字符,直到读取到\n时,缓冲区清理完毕
{
}
printf("密码是%s\n确认请按1,取消请按0\n",arr);
int ret = 0;
again:
scanf("%d", &ret);
switch (ret)//选择语句
{
case 1:
printf("确认成功\n");
break;
case 0:
printf("取消成功\n");
break;
default:
printf("输入错误,重新输入\n");
goto again;//如果输入错误,跳回again重新来
}
return 0;
}
设置一个char类型的数组,假设在输入密码时不小心输入了空格,例如w123 456,那么getchar会把后面的 456读取走,不影响后面scanf的输入。switch和goto语句在后期会学到。
putchar函数的使用
putchar函数除了能够输出显示在显示器上的字符,也能够输入屏幕控制字符。
例如:putchar(‘\n’)的作用便是在屏幕上换行,作用与printf("\n")一样。
#int main()
{
char a = 'a', b = 'b', c = 'c';
int a1 = 97, b1 = 98, c1 = 99;
putchar(a);//直接输出字符
putchar(b);
putchar(c);
putchar('\n');//两种换行符
printf("\n");
putchar(a1);//利用ASCII码输出字符(putchar方式)
putchar(b1);
putchar(c1);
putchar('\n');
printf("\n");
printf("%c", a1); //利用ASCII码输出字符(printf方式)
printf("%c", b1);
printf("%c", c1);
return 0;
}
通过上述例子,我们还发现,putchar可以利用ASCII码值打印字符,只要其值在ASCII码的范围内即可(0~127)。而printf也有利用ASCII码输出字符的方式,以上三种方式输出的结果一致。
注:由于putchar是字符输出的函数,所以putchar(97)只能输出‘a’,而不能输出整数97。
边栏推荐
- Alibaba cloud microservices (III) sentinel open source flow control fuse degradation component
- Network layer 7 protocol
- Music playback (toggle & playerprefs)
- What are the advantages of using SQL in Excel VBA
- Cloud native trend in 2022
- Differences and application scenarios between MySQL index clock B-tree, b+tree and hash indexes
- The overseas sales of Xiaomi mobile phones are nearly 140million, which may explain why Xiaomi ov doesn't need Hongmeng
- 阿里云微服务(二) 分布式服务配置中心以及Nacos的使用场景及实现介绍
- ROS machine voice
- Small exercise of library management system
猜你喜欢
3.C语言用代数余子式计算行列式
5.函数递归练习
View UI Plus 发布 1.3.0 版本,新增 Space、$ImagePreview 组件
9.指针(上)
TYUT太原理工大学2022软工导论大题汇总
Summary of multiple choice questions in the 2022 database of tyut Taiyuan University of Technology
2.C语言矩阵乘法
TYUT太原理工大学2022数据库大题之数据库操作
System design learning (I) design pastebin com (or Bit.ly)
6.函数的递归
随机推荐
Interview Essentials: talk about the various implementations of distributed locks!
IPv6 experiment
Implement queue with stack
View UI Plus 发布 1.2.0 版本,新增 Image、Skeleton、Typography组件
最新坦克大战2022-全程开发笔记-2
凡人修仙学指针-1
图书管理系统小练习
Error: symbol not found
TYUT太原理工大学2022数据库大题之E-R图转关系模式
Record: I accidentally wrote a recursion next time
架构师怎样绘制系统架构蓝图?
Arduino+ds18b20 temperature sensor (buzzer alarm) +lcd1602 display (IIC drive)
6.函数的递归
Set container
XV Function definition and call
What are the advantages of using SQL in Excel VBA
E-R graph to relational model of the 2022 database of tyut Taiyuan University of Technology
MYSQL索引钟B-TREE ,B+TREE ,HASH索引之间的区别和应用场景
抽象类和接口
Record: Navicat premium can't connect to MySQL for the first time