C语言入门教程-(5)格式化输入输出
1.输入和输出
在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出。在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出。
2.格式化输出—printf()函数
C语言程序运算的结果在内存中,我们需要将其输出到指定设备中,我们才可以看到数据。printf是print format的缩写,意思是“格式化打印”。“打印”的意思就是在屏幕上显示内容,所以我们称printf是格式化输出。
2.1 printf()函数
在前面我们有简单的使用过printf()函数,printf()函数的一般语法格式如下:
printf("<格式化字符串>",<输出列表>);
- 格式化字符串:用双引号括起来的字符串,字符串包含的普通字符,printf()函数将其原样输出到屏幕上;以"%"开头的格式字符,printf()函数将数据转换为指定的格式输出到屏幕上。
- 输出列表:需要输出到屏幕的数据,数据可以是常量、变量或者表达式。
【实例5.1】printf()函数输出“C语言入门教程”。
#include <stdio.h>
int main()
{
printf("关注公众号:程序员基础知识");
return 0;
}
执行以上程序,输出结果为:
关注公众号:程序员基础知识
实例解析:
printf()函数用于格式化输出到屏幕,在头文件(标准输入输出头文件)中声明。当编译器调用printf()函数时,如果没有头文件,会发生编译错误。实例中,printf()函数只有“格式化字符串”,省略了“输出列表”。该语句字符串只包含的普通字符,printf()函数将其原样输出到屏幕上。
2.2 printf()函数的字符格式
格式化字符串中如果包含以“%”开头的格式字符,printf()函数将数据转换为指定的格式输出到屏幕上。格式化字符串中包含三部分,即原样输出文字、控制字符、转义字符。如果输出列表有两个变量或者多个组成,变量之间需要用逗号隔开,多个变量与格式字符串的控制字符一一对应。
输出不同的类型需要使用不同的控制符,这里汇总了一些常见的控制符,如下表所示。
格式字符 | 意义 |
---|---|
%d | 输出十进制整数,一般对应int类型 |
%i | 输出十进制整数,与%d相同 |
%c | 输出字符,一般对应char类型 |
%f | 输出十进制实数,一般对应float类型,也可以是double类型 |
%lf | 输出十进制实数,一般对应double类型,也可以是float类型 |
%% | 输出百分号(%) |
C语言中定义了一些字母前加"\"来表示那些不能直接显示的ASCII字符,称为转义字符。汇总了几个常用的转义字符,如下表所示。
转义字符 | 意义 |
---|---|
\n | 换行,将当前位置移到下一行开头 |
\t | 水平制表,跳到下一个Tab位置 |
\\ | 代表一个反斜线字符'\' |
【实例5.2】通过格式化输出盖伦属性。
#include <stdio.h>
int main()
{
char garenName = 'G';
printf("名字:%c\n", garenName);
int garenHp = 455;
int garenMoveSpeed = 340;
printf("生命值:%d\t移动速度:%d\n", garenHp, garenMoveSpeed);
float garenAttackSpeed = 0.625;
printf("攻击速度:%f\n", garenAttackSpeed);
printf("攻击速度:%lf\n", garenAttackSpeed);
return 0;
}
执行以上程序,输出结果为:
名字:G
生命值:455 移动速度:340
攻击速度:0.625000
攻击速度:0.625000
实例解析:
控制字符%c输出一个字符G,转义字符\n代表换行。生命值和移动速度之间有一个Tab的间隔,这是因为中间有转义字符\t。float型的控制字符既可以用%f也可以用%lf。在printf()中,%f或者%lf控制字符既可以输出float型又可以输出double型。但在输入的时候则需要注意,float型对应%f,double型对应%lf,本节后面会讲到。
3.格式化输入—scanf()函数
输入的意思是向程序填充一些数据,scanf()函数用于从标准输入(比如键盘)读取并格式化。scanf是scan format的缩写,意思是“扫描格式化”。我们称scanf是格式化输入。
3.1 scanf()函数
scanf()函数也是一个标准库函数,在头文件中。scanf()函数的一般语法格式如下:
scanf("<格式化字符串>",<地址列表>);
- 格式化字符串:用双引号括起来的字符串,一般只有"%"开头的格式字符。
- 地址列表:各个变量的地址,变量的地址通过取地址符号"&"和变量名得到。比如,&a代表变量a的地址。我们不需要关心具体的地址是什么,只需要在变量名前加上取地址符号"&"即可。我们需要注意,scanf()函数要求给出地址,如果只有变量名则会报错。scanf()函数也可以和printf()函数一样可以接受多个值,变量之间需要用逗号隔开,需要一一对应。
【实例5.3】通过格式化输入并且输出盖伦属性。
#include <stdio.h>
int main()
{
char garenName;
printf("Please input garenName:");
scanf("%c", &garenName);
printf("名字:%c\n", garenName);
int garenHp;
int garenMoveSpeed;
printf("Please input garenHp and garenMoveSpeed:");
scanf("%d%d", &garenHp, &garenMoveSpeed);
printf("生命值:%d\t移动速度:%d\n", garenHp, garenMoveSpeed);
float garenAttackSpeed;
printf("Please input garenAttackSpeed:");
scanf("%f", &garenAttackSpeed);
printf("攻击速度:%f\n", garenAttackSpeed);
return 0;
}
执行以上程序,输出结果为:
Please input garenName:G
名字:G
Please input garenHp and garenMoveSpeed:455 340
生命值:455 移动速度:340
Please input garenAttackSpeed:0.625
攻击速度:0.625000
实例解析:
scanf()函数不能输出提示信息,所以我们一般会在前面使用printf()函数来提示。实例中,Please input garenName:就是提示语句,我们输入一个字符'G',然后回车键表示输入完成。生命值和移动速度的输入值,需要分别保存到两个变量中,scanf()函数使用空白字符(空格、换行、制表符Tab)来分隔输入的数据。455和340之间使用了空格来分隔也可以使用回车来分隔开,scanf()函数将455保存到变量garenHp中,将340保存到garenMoveSpeed中。使用scanf()函数当输入数据是float类型时用%f,当输入数据是double类型时用%lf。
注意:如果用VS遇到scanf报错,将报错的宏定义(_CRT_SECURE_NO_WARNINGS)添加到项目属性 -- C/C++ -- 预处理器 -- 预处理器定义。要注意自己使用的调试平台和属性页的配置是一致的。比如用的是Debug的x64调试,在进入项目属性也要配置一致。
3.2 scanf()函数的其他使用情况
1)宽度
我们可以在scanf()函数中指定输入的宽度,达到宽度后,后面的数据将会赋给下一个变量,如果只有一个变量则会将后面的数据舍弃。
scanf("%2d", &garenHp);
当输入"455"时,将只有45保存到变量garenHp中,其余数据被舍弃。
scanf("%2d%d", &garenHp, &garenMoveSpeed);
当输入"455"时,将45保存到变量garenHp中,5保存到变量garenMoveSpeed中。
2)星号
在格式字符串中使用星号,将会跳过这个输入值。
scanf("%d%*d%d", &garenHp, &garenMoveSpeed);
上面语句中,当输入"1 2 3"时,scanf()将第一个数1保存到变量garenHp,第二个数2将会被跳过,然后将第三个数3保存到变量garenMoveSpeed中。
4.getchar()函数和putchar()函数
getchar()函数用于接收键盘输入的下一个字符,并把它返回为一个整数,在同一个时间内只会读取一个字符。当调用getchar()函数时,程序就会等待。我们输入的字符被存放在输入缓冲区中,直到按回车为止。输入的字符会回显在屏幕上,能被我们所看见。getchar()函数从输入缓冲区中读入第一个字符。其函数原型如下:
int getchar(void);
该函数的参数是void,不需要任何参数。当发生读取错误的时候,返回-1。当读取正确的时候,它会返回从键盘输入的第一个字符的ASCII码。
putchar()函数把字符输出到显示器上,并返回相同的字符,在同一个时间内只会输出一个字符。其函数原型如下:
int putchar(int ch);
该函数的参数是int类型。然后参数被转换为对应字符的ASCII码,最后输出该ASCII码对应的字符。
【实例5.4】getchar()函数和putchar()函数
#include <stdio.h>
int main()
{
char ch;
printf("Please input a ch:");
ch = getchar();
printf("ch is:");
putchar(ch);
return 0;
}
执行以上程序,输出结果为:
Please input a ch:a
ch is:a
实例解析:
getchar()和putchar()函数也在头文件中。首先定义了一个字符类型的ch变量,然后我们从键盘输入"a"加上回车。这个时候,输入缓冲区中有字符a以及回车符号。getchar()函数从输入缓冲区中读取第一个字符,将a存入到变量ch中,然后putchar()函数将其输出。
5.getch()函数和putch()函数
getch()函数和前面讲到的getchar()函数功能基本相同,也是接收输入的一个字符。getch()函数直接从键盘获取值,不等待回车键。只要获取到一个值,便立即返回。getch()函数输入的字符不回显,我们在屏幕上也看不到。因此,getch()函数常用来做调试。我们使用vs调试程序时,如果不使用Ctrl+F5,直接使用F5,控制台输出窗口将会一闪而逝。我们可以在程序中加上getch()函数,让程序暂停,这样就不会一闪而逝了,当从键盘按任意键后程序会继续运行。其函数原型如下:
int getch(void);
putch()函数在使用上和putchar()函数没什么区别,也是用来向屏幕中输出一个字符。其函数原型如下:
int putch(int ch);
【实例5.5】getch()函数和putch()函数
#include <stdio.h>
#include <conio.h>
int main()
{
char ch = 'a';
_putch(ch);
_getch();
return 0;
}
执行以上程序,输出结果为:
a
实例解析:
getch()函数和putch()函数在头文件中。这个程序中,我们使用putch()函数输出变量ch,然后调用getch()函数使程序暂停,从键盘输入任意键,程序成功执行完毕。在VS2012之后,我们直接使用getch()和putch()会报错,我们需要在前面加上下划线变成_getch()和_putch(),像实例中一样。
6.总结
总结一下,本节内容主要介绍了C语言程序的格式化输入和输出。介绍了scanf()函数和printf()函数、getchar()函数和putchar()函数、getch()函数和putch()函数。
7.练习
5-1 下面一段程序将会输出什么?
#include <stdio.h>
int main()
{
int a = 10;
printf("%d %d", a);
return 0;
}
5-2 编写一个程序,要求输出两个百分号"%%"和两个"\"。
5-3 编写一个程序,要求输入两个变量,一个变量代表盖伦血量,一个变量代表提莫攻击力。然后模拟提莫攻击盖伦,输出盖伦剩余血量。盖伦剩余血量 = 盖伦血量 - 提莫攻击力。
5-4 编写一个程序,使得输入字符,可以直接转换为ASCII码值。
可以在评论中,写下你们的练习答案。
之后的文章会给大家带来更精彩的内容
欢迎关注我的知乎专栏:程序员基础知识
获取练习答案以及更多实战项目
欢迎关注我的公众号:程序员基础知识
交(gao)流(ji)群:493584686
C语言入门教程-(5)格式化输入输出的更多相关文章
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- Go语言入门教程(十)之函数
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
- c语言该怎么入门?C语言入门教程(非常详细)
C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言.C语言是计算机产业的核心语言,操作系统.硬件驱动.关键组件.数据库等都离不开C语言:不学习C语言,就不能了解计算机底层. 这套「C语 ...
- 《JavaScript语言入门教程》记录整理:入门和数据类型
目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...
- 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
- 《JavaScript语言入门教程》记录整理:面向对象
目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...
- Go 语言入门教程,共32讲,6小时(已完结)
Go语言入门教程,共32讲,6小时(完结) 在B站:https://www.bilibili.com/video/BV1fD4y1m7TD/
- c语言之字符串和格式化输入输出
字符串和格式化输入输出 #include<stdio.h> #include<string.h> #define DENSITY 62.4 int main(void) { f ...
- c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...
随机推荐
- ASP.NET Claims-based认证实现认证登录-claims基础知识
claims-based认证这种方式将认证和授权与登录代码分开,将认证和授权拆分成另外的web服务.活生生的例子就是我们的qq集成登录,未必qq集成登录采用的是claims-based认证这种模式,但 ...
- webstorm忽略node_modules目录
我在使用了cnpm后node_modules之前的层级目录变成了同一级目录,所以目录很多,造成webstorm读取时卡死. 网上大家列了各种方法,在这里我归纳一下! 先给大家看看一些相关链接. 方法1 ...
- shell黑名单
#/bin/bash netstat -ant | " | awk '{print $5}' | grep -v "^10" | cut -d ":" ...
- oracle动态添加一条记录
/// <summary> /// 添加一个实体 /// </summary> /// <typeparam name="T">实体名称< ...
- sql server单个字段列转行由,隔开
SELECT STUFF((SELECT ','+字段名 FROM 表名 for xml path('')),1,1,'')
- 阿里云ECS服务器环境搭建 ubuntu 16.04 图形界面的安装
https://blog.csdn.net/zwq912318834/article/details/80528374
- MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
- Linux 系统的用户和组详解_【all】
1.Linux 用户和用户组详解 2.Linux 文件特殊权限详解 3.Linux 文件的读写执行权限的说明 4.Linux 架构之简述企业网站 5.Linux 环境变量设置详解 6.企业生产环境用户 ...
- Hadoop HBase概念学习系列之HBase里的4维坐标系统(第一步定位行键 -> 第二步定位列簇 -> 第三步定位列修饰符 -> 第四步定位时间戳)(十八)
HBase里的4维坐标系统(第一步定位行键 -> 第二步定位列簇 -> 第三步定位列修饰符 -> 第四步定位时间戳) HBase里的4维坐标系统(第一步定位行键 ...
- fountion 的调用 和 打印返回值 + 占位符
结果: (2) 结果