【C语言入门教程】3.2 数据的输入 与 输出
在程序的运行过程中,通常需要用户输入一些数据,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互。所以在程序设计中,输入输出语句是一类必不可少的重要语句。在 C 语言中,没有专门的输入输出语句,所有的输入输出操作都是通过对标准输入输出库函数(包含在 “stdio.h” 头文件中)的调用实现。最常用的输入输出函数有 scanf()、printf()、getchar()、putchar()。
3.2.1 scanf()函数
格式化输入函数 scanf() 的功能是从键盘上输入数据,所获得的数据按指定输入格式被赋给相应的输入项。函数一般形式为:
scanf("控制字符串", 输入项列表);
其中控制字符串规定数据的输入格式,必须用双引号括起,其内容是由格式说明和普通字符两部分组成。输入项列表则由一个或多个变量地址组成,当变量地址有多个时,各个变量地址之间用逗号“,”分隔。
scanf()函数输入项列表中各变量要加取地址操作符,就是变量名前加 “&”,只有这样函数才能改变其值。输入类型与变量类型应尽量一致,已避免类型不匹配而造成的错误。
控制字符串由两个组成部分 -- 格式说明 和 普通字符。格式说明规定了输入项中的变量以何种类型的数据格式被输入,形式是:
%<修饰符>格式字符
修饰符是可选的,用以表示输入字段宽度、约定整数是短整型还是长整型、是否屏蔽输入的数据。格式字符用以约定输入数据的数据类型,如下表所示:
输入格式字符 | |||
---|---|---|---|
格式字符 | 说明 | 格式字符 | 说明 |
d | 输入一个十进制整数 | e | 输入一个指数形式的浮点数 |
o | 输入一个八进制整数 | c | 输入一个字符 |
x | 输入一个十六进制整数 | s | 输入一个字符串 |
f | 输入一个小数点形式的浮点数 |
如果需要输入一个十进制长整型数据,且规定字段宽度为 9 位有效数字,可用下面的代码完成:
long a; // 声明一个长整型变量
scanf("%91d", &a) // 输入一个字段宽度为 9 位有效数字的十进制整型数据,保存到变量 a 中
程序运行时,会要求在终端上输入数据,输入后按 Enter 键,程序继续运行。假如输入的数据是 1234567890,那么前 9 位数字将作为有效的输入,变量 a 保存的数值为 123456789。在需要屏蔽输入的某个数据时,可使用修饰符 “*”,如下例所示:
char c1, c2, c3; // 声明 3 个字符型变量
scanf("%c%*c%c", &c1, &c2, &c3); // 输入 3 个字符型数据,分别保存在变量 c1、c2、c3中,但 c2 对应的输入数据被屏蔽
当输入的数据为 abc 时,变量 c1 中保存的字符型数据为 a,变量 c3 保存的数据为 c,变量 c2 没有保存任何数据,仍然是未赋值状态。
控制字符串的普通字符主要是用作多个数据间的分隔,或者表示某种特定的输入格式。例如,通常用空格或者逗号来表示多个数据之间的分隔,如下例所示:
int a, b, c; // 声明 3 个整型变量
scanf("%d, %d, %d", &a, &b, &c); // 输入 3 个整型数据,分别保存在变量 a、b、c中
控制字符串中,3 个输入格式说明被用逗号隔开,所以如果要为变量正确赋值,输入时必须遵循这种格式,如输入 12,15,18。假如输入的数据是 12 15 18,数据间用空格分隔,那么就与规定的格式不符,上例中只有第一个变量 能被正确赋值。另外,像换行符、制表符这样的转义字符也可以被用作输入数据间的分隔。
3.2.2 printf()函数
与格式化输入函数相对应的是格式化输出函数 printf(),作用是按 “控制字符串” 规定的格式向终端输出数据。其基本格式为:
printf("控制字符串", 输出项列表);
控制字符串由格式说明和普通字符两部分组成,必须用双引号包围。格式说明一般形式为:
%<修饰符>格式字符
格式字符规定了对应输出项的输出格式,常用格式字符如下表所示:
输出 | |||
---|---|---|---|
格式字符 | 说明 | 格式字符 | 说明 |
d | 输出一个十进制整数 | e | 输出一个指数形式的浮点数 |
u | 输出一个无符号十进制整数 | g | 自动选择 f 和 e 格式中较短的形式输出 |
o | 输出一个八进制整数 | c | 输出一个字符 |
x | 输出一个十六进制整数 | s | 输出一个字符串 |
f | 输出一个小数点形式的浮点数 |
修饰符是可选的,用于确定数据输出的宽度、精度、小数位数、对齐方式等,从而产生更规范整齐的输出。当没有修饰符时,以上各项按系统默认设定显示。如下例所示:
int a = 123; // 定义一个整型变量并赋值
float b = 45.6789; // 定义一个浮点型变量并赋值
printf("%5d-%5.2f", a, b); // 格式化输出变量 a 和 b,变量 a 字段宽度为 5,变量 b 在小数点前字段宽度为 5,小数点后为 2
代码中,printf()函数输出的结果为:
123- 45.68
控制字符串中输出的整数的字段宽度为 5 位,变量 a 的宽度为 3 位,不足的 2 位由空格补齐;输出的浮点型数的小数点前 5 位,而变量 b 小数点前为 2 位,不足的 3 位由空格补齐,小数点后是 2 位,而变量 b 小数点后为 4 位,输出函数会自动进行四舍五入运算。如果整型数据或浮点数整型部分对应的输出位数比实际要短,那么会被自动加长补齐。
用负号做修饰符,则可规定字段宽度在大于变量实际长度时,输出数据的对齐方式。如下例所示:
int a = 123; // 定义一个整型变量并赋值
printf("%-5\n", a); // 格式化输出变量 a,输出的数值向左对齐
printf("%5d\n", a); // 格式化输出变量 a,输出的数值向右对齐,这是默认值
输出结果:
123
123
这段代码分两行输出变量 a 的值,第一行因为使用了向左对齐的符号,所以变量 a 的值以左对齐方式输出。第二行则是以默认方式右对齐输出。
修饰符中 l 和 h 可以规定是以长型还是短型输出数据,例如 %hd 表示短整型,%lf 表示双精度浮点型,%ld 表示长整型,%hu 表示无符号短整型。
格式化输出函数还可以直接将字符串常量放在格式说明语句中输出,但通常是将字符串常量与输出格式字符组合使用,以实现各种输出效果。如下例所示:
float sec1, sec2; // 定义两个浮点型变量,表示某学生第一和第二学期的成绩
sec1 = 88.0; // 为变量赋值
sec2 = 79.5;
printf("第一学期成绩是:%2.1f\n", sec1); // 输出第一学期成绩
printf("第二学期成绩是:%2.1f\n", sec2); // 输出第二学期成绩 printf("总分是:%3.1f,平均分是:%2.1f\n",
sec1 + sec2, (sec1 + sec2) / 2); // 输出两学期的总分和平均分
输出结果:
第一个学期成绩是:88.0
第二个学期成绩是:79.5
总分是:167.5,平均分是:83.8
该代码将把格式说明语句中的字符串常量和输出项列表里的变量值一同输出。可见,输出格式字符的作用仿佛是运行时被输出项的值替换。输出项也可以是表达式,如代码第 7 行所示。另外,代码最后一行被分做两行书写,这是为了阅读方便,C 语言里是允许的。
3.2.3 getchar()函数 与 putchar() 函数
getchar()函数的作用是从终端获得一个字符,putchar()函数的作用是向终端输出一个字符。与前面介绍的两个输入输出函数不同的是,getchar() 与 putchar() 函数每次只能操作一个 ASCII 代码。因此,在设计基于文本界面的简单应用程序时,常利用这一特性实现菜单选择的输入和用户确认的输入。
getchar()没有任何参数,使用方法是直接返回一个字符。putchar()是用一个字符型数据作为参数,执行时直接将该字符型数据输出到终端上。下例将实现一个运行在终端上的文本菜单:
#include <stdio.h> int main()
{
char ch; // 声明一个字符型变量,用作接受输入
printf("如果您要输出字母 A,请输入数字 1\n"); // 输出菜单文本
printf("如果您要输出字母 B,请输入数字 2\n"); // 输出菜单文本
ch = getchar(); // 获取键盘上输入的字符 if (ch == '1') // 判读所输入的字符是否为 2
{
putchar('A'); // 输出字母 B
}
else if (ch == '2') // 判断所输入的字符是否为 2
{
putchar('B'); // 输出字母 C
}
else // 将 1 和 2 以外的字符作为非法输入处理
{
printf("您输入的字符不在选择范围\n"); // 输出错误提示
} printf("\n 按任意键退出程序"); // 操作等待提示
getchar(); // 输入任意字符后继续运行 return 0; // 程序结束
}
代码第 4 行使用 getchar() 函数将输入的字符保存在字符型变量 ch 中。第 5 行至第 13 行,根据 ch 的值判断所需执行的语句。代码第 15 行只使用了 getchar() 函数而没有变量与之相连接,程序运行到这条语句时被该函数中断执行等待输入。而输入的任何数值都不会被保存,这就是在文本界面程序中常见的用户确认功能实现方法。
注意:getchar() 与 putchar() 函数包含在头文件 stdio.h 中,使用前必须用 “#include <stdio.h>” 命令将该头文件包含在代码中,否则编译器会出现警告提示。
【C语言入门教程】3.2 数据的输入 与 输出的更多相关文章
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- C语言入门教程-(5)格式化输入输出
1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...
- Go语言入门教程(十)之函数
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
- 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
- 《JavaScript语言入门教程》记录整理:面向对象
目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- 智能合约语言 Solidity 教程系列4 - 数据存储位置分析
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 这部分的内容官方英文文档讲的不是很透,因此我在参考Soli ...
- c语言该怎么入门?C语言入门教程(非常详细)
C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言.C语言是计算机产业的核心语言,操作系统.硬件驱动.关键组件.数据库等都离不开C语言:不学习C语言,就不能了解计算机底层. 这套「C语 ...
- 《JavaScript语言入门教程》记录整理:入门和数据类型
目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...
- Go 语言入门教程,共32讲,6小时(已完结)
Go语言入门教程,共32讲,6小时(完结) 在B站:https://www.bilibili.com/video/BV1fD4y1m7TD/
随机推荐
- IDEA新建MAVEN项目时速度缓慢
原因 IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令执行时,需要指定一个archetype-catalog.xml文件. 该命令的 ...
- HDU 1166 敌兵布阵(线段树模板题)
题目链接: 传送门 敌兵布阵 Time Limit: 2000MS Memory Limit: 32768 K Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...
- JSP实现数据传递与保存
业务逻辑: 1.登陆login.jsp 2.判断登陆是否成功check.jsp 3.登陆成功页面newsDetail.jsp 4.登陆失败转发到login.jsp 代码如下: <%@ page ...
- 看了汤姆大叔的“你真懂JavaScript吗?”的一些感慨
看了汤姆大叔的“你真懂JavaScript吗?”,里面有5道题目,我都一一作了,然后在chrome的控制台里面运行了一遍,虽然只错了一道,但还是细细读了下答案,在此总结一下,看看是否对大家对这些Jav ...
- JQuery------如何判断当前点击的是否是哪个类
$(document).ready(function () { $("html").click(function (e) { if (e.target == $(".ad ...
- aircrack-ng 多网卡启动后环境清理
#!/bin/sh pkill airodump airmon-ng stop wlan0mon service network-manager restart rm -rf sadsad*
- Linux修改oracle 10g的字符集
修改数据库字符集为:ZHS16GBK查看服务器端字符集SQL > select * from V$NLS_PARAMETERS修改:$sqlplus /nologSQL>conn / as ...
- ecshop默认配置
手机端 1.C, 系统默认所有配置 输出:print_r(C())
- js数字、字符串、数组之间的转化
1.数组转字符串 var a, b; a = ,,,,); b = a.join("-"); 2.字符串转数组 var s = "abc,abcd,aaa"; ...
- iOS监听键盘事件
#pragma mark - view life cycle - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter def ...