3.5 数据的输入输出
3.5.1 输入输出示例
示例分析
我们来分析一个示例程序,该程序求解一元二次方程 𝑎𝑥2+𝑏𝑥+𝑐=0ax2+bx+c=0 的根,其中 a, b, c 是由用户输入的系数,并假设 𝑏2−4𝑎𝑐>0b2−4ac>0 以确保方程有两个实根。
解题方法
对于一元二次方程,根据数学公式,其解为:
程序实现
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, discriminant, x1, x2, p, q;
// 输入 a, b, c 的值
printf("Enter coefficients a, b and c: ");
scanf("%lf %lf %lf", &a, &b, &c);
// 计算判别式 (discriminant)
discriminant = b * b - 4 * a * c;
// 计算根
p = -b / (2.0 * a);
q = sqrt(discriminant) / (2.0 * a);
x1 = p + q;
x2 = p - q;
// 输出结果
printf("Roots of the equation are: x1 = %.2f, x2 = %.2f\n", x1, x2);
return 0;
}
输入输出分析
- 输入:使用
scanf
函数从键盘读取 a, b, c 的值。注意,输入的格式是连续的,用空格隔开,例如输入1 3 2
对应 a=1, b=3, c=2。 - 输出:使用
printf
函数输出计算得到的方程的根。格式化输出使得根的显示保留两位小数,以便更清晰地观察结果。
注意事项
- 确保在使用
sqrt
函数之前,判别式 𝑏2−4𝑎𝑐b2−4ac 必须是非负的。 - 使用
%lf
格式说明符读取和打印double
类型的变量。 - 程序假设
,在实际应用中,应增加条件检查确保方程有实根。
增强的用户体验
为了让程序更健壮,可以添加判别式的检查,确保输入的系数确实能得到实数根,并对各种情况做出相应的处理(比如复根或单根的情况)。
3.5.2 有关数据输入输出的概念
在C语言中,数据的输入和输出是通过标准库函数实现的,而不是语言内置的功能。理解这一点对于编写互动或数据处理程序至关重要。
输入输出基础
1. 输入输出的定义
- 输出: 将数据从计算机传输到外部设备(如显示器、打印机等)。
- 输入: 从外部设备(如键盘、文件等)获取数据到计算机中。
2. C语言的输入输出实现
C语言没有内置的输入输出语句,这些功能是通过库函数如 printf()
和 scanf()
提供的,这些函数不是C语言的关键字,而是标准库中定义的函数。
3. 库函数的作用
库函数简化了复杂的输入输出操作,使得程序员可以不直接处理底层的硬件细节,而专注于程序逻辑。
输入输出函数
常用的输入输出函数
printf()
: 用于输出格式化文本到标准输出设备(通常是屏幕)。scanf()
: 用于从标准输入设备(通常是键盘)读取输入符合指定格式的数据。putchar()
,getchar()
: 分别用于输出和输入单个字符。puts()
,gets()
: 分别用于输出和输入一个字符串(gets()
已被废弃因为存在安全风险,推荐使用fgets()
)。
使用示例
#include <stdio.h>
int main() {
int age;
printf("Enter your age: ");
scanf("%d", &age);
printf("You are %d years old.\n", age);
return 0;
}
预处理指令 #include
引入标准输入输出库
- 使用
#include <stdio.h>
将标准输入输出库中的声明和宏引入程序中。 - 这使得在程序中可以使用
printf()
,scanf()
等函数。
#include
的形式
<stdio.h>
: 从编译器的标准库路径中寻找和包含stdio.h
。"stdio.h"
: 首先在当前目录下寻找stdio.h
,如果找不到,再在标准库路径中寻找。
总结
理解和正确使用C语言中的输入输出函数是基本编程技能的一部分。这些函数提供了与外部世界交互的窗口,允许程序在用户和其他系统之间传递信息。通过标准库的使用,C语言保持了其编译系统的简洁和高效,同时提高了其可移植性和灵活性。
3.5.3 使用 printf
函数输出数据
在C语言中,printf
是用于输出的主要函数,它允许程序员以多种格式显示数据。掌握 printf
的使用是进行有效编程的关键部分,尤其是在需要输出复杂数据或格式化文本时。
printf
函数的基本使用
1. 函数的一般格式
printf
的基本语法是:
printf("格式控制字符串", 输出列表);
- 格式控制字符串:包含一系列的格式说明符,用于定义如何显示变量或表达式的值。格式说明符通常以
%
开头,如%d
、%f
等。 - 输出列表:包括一个或多个提供给格式说明符的对应值的变量或表达式。
2. 格式说明符
%d
或%i
:输出整数。%f
:输出浮点数。%c
:输出单个字符。%s
:输出字符串。%x
或%X
:以十六进制形式输出无符号整数。%p
:输出指针地址。
3. 实例
int a = 5, b = 10;
printf("%d %d\n", a, b); // 输出: 5 10
float pi = 3.14159;
printf("Pi is approximately %.2f\n", pi); // 输出: Pi is approximately 3.14
char c = 'A';
printf("The character is %c\n", c); // 输出: The character is A
4. 普通字符与格式声明
普通字符在 printf
的格式字符串中原样输出,例如:
printf("Hello, World!\n"); // 输出: Hello, World!
printf("a=%d b=%d\n", a, b); // 输出: a=5 b=10
普通字符包括空格、逗号、换行符 \n
等,这些都会按照它们在字符串中的顺序显示。
注意事项
-
格式控制的准确性:使用正确的格式说明符对应数据类型是必须的,错误的格式说明符可能导致不正确的输出或运行时错误。
-
数据类型对应:确保提供给
printf
的变量类型与格式说明符匹配。例如,不应该用%d
来输出浮点数。 -
输出格式化:可以在格式说明符中指定宽度、精度等,例如
%7.2f
表示浮点数输出占据至少7个字符宽的空间,其中包括两位小数。
结论
printf
是一种功能强大的输出函数,提供了极高的灵活性来格式化输出。熟练使用 printf
可以大幅提高C语言程序的表达能力,使得输出更加人性化和易于理解。通过实践和多做练习可以更好地掌握其用法。
2. 格式字符
在C语言中,printf
函数使用格式字符来指定输出数据的类型和格式。理解和使用这些格式字符是精确控制输出的关键。下面将详细介绍常用的格式字符及其应用。
常用格式字符
1. %d
和 %i
- 用途: 用于输出带符号的十进制整数。
- 示例:
int num = 5; printf("%d\n", num); // 输出: 5 printf("%5d\n", num); // 输出: ' 5' (前面有4个空格)
2. %c
- 用途: 用来输出一个字符。
- 示例:
char ch = 'a';
printf("%c\n", ch); // 输出: a
printf("%5c\n", ch); // 输出: ' a' (前面有4个空格)
3. %s
- 用途: 用来输出一个字符串。
- 示例:
printf("%s\n", "Hello, World!"); // 输出: Hello, World!
4. %f
- 用途: 用来输出浮点数(实数),默认显示6位小数。
- 示例:
float number = 3.14159;
printf("%f\n", number); // 输出: 3.141590
printf("%.2f\n", number); // 输出: 3.14 (显示2位小数)
printf("%6.2f\n", number); // 输出: ' 3.14' (总宽度为6)
5. %e
和 %E
- 用途: 以指数形式输出实数。
- 示例:
double value = 123.456;
printf("%e\n", value); // 输出: 1.234560e+02
printf("%E\n", value); // 输出: 1.234560E+02
printf("%12.5e\n", value); // 输出: ' 1.23456e+02' (总宽度为12)
6. %o
- 用途: 以八进制无符号整数形式输出。
- 示例:
int num = 18;
printf("%o\n", num); // 输出: 22 (18的八进制表示)
7. %x
和 %X
- 用途: 以十六进制无符号整数形式输出,
%x
输出小写字母,%X
输出大写字母。 - 示例:
printf("%x\n", 255); // 输出: ff printf("%X\n", 255); // 输出: FF
8. %u
- 用途: 用来输出无符号十进制整数。
- 示例:
unsigned int num = 3000000000; printf("%u\n", num); // 输出: 3000000000
9. %g
和 %G
- 用途: 输出浮点数,自动选择
%f
或%e
(%G
与%E
类似),以较短的形式显示,并且不输出无意义的零。 - 示例:
double num = 0.00012345; printf("%g\n", num); // 输出: 0.00012345
格式修饰符
在格式字符前,可以添加修饰符来控制输出的宽度、精度和对齐方式。例如 %10.2f
表示输出的浮点数至少占10个字符宽,其中包括2位小数。
理解并合理使用这些格式字符和修饰符,可以有效地控制数据的输出格式,使程序输出更加符合用户的阅读习惯。
3.5.4 使用 scanf
函数输入数据
scanf
是 C 程序中用于从标准输入(通常是键盘)读取数据的主要函数。了解 scanf
的正确用法是保证数据正确输入的关键。
1. scanf
函数的一般形式
scanf
的基本语法为:
scanf("格式控制", &变量1, &变量2, ..., &变量N);
- 格式控制: 类似于
printf
,指定输入数据的类型。 - 地址列表: 变量的地址,确保输入的数据可以存储到指定的变量中。
2. scanf
函数中的格式声明
格式声明以 %
开始,后跟一个或多个指定的格式字符,用于定义输入数据的类型和处理方式。以下是一些常用的格式字符:
- %d: 读取一个十进制整数。
- %i: 读取一个整数(自动检测十进制、八进制或十六进制)。
- %f: 读取一个浮点数。
- %lf: 读取一个双精度浮点数。
- %c: 读取一个字符。
- %s: 读取一个字符串,直到遇到空白字符。
- %x: 读取一个十六进制数。
示例使用
int a;
float b;
char c[100];
scanf("%d %f %s", &a, &b, c);
3. 使用 scanf
函数时的注意事项
1. 变量地址
在使用 scanf
时,除了 %c
, %s
和数组外,必须在变量名前加 &
符号来传递变量的地址。
2. 匹配格式字符串
如果格式控制字符串中除了格式说明符之外还包含其他字符,则输入时必须严格匹配这些字符。
int a;
float b;
char c[100];
scanf("%d %f %s", &a, &b, c);
在这种情况下,输入必须包含字符 a=
, b=
, c=
和两个逗号。
3. 使用 %c
%c
用于输入字符时,不会自动跳过前面的空白字符,如空格或换行。为避免意外读取前一个输出的换行符,可以在 %c
前加一个空格:
int a, b, c;
scanf("a=%d,b=%d,c=%d", &a, &b, &c);
4. 读取时遇到非法字符
如果输入的数据与格式字符串不匹配,scanf
会停止读取,留下未处理的数据在输入缓冲区中。
5. 使用 %s
当使用 %s
读取字符串时,scanf
会自动在字符串的末尾添加 null 字符 \0
,所以确保分配给字符串的数组足够大,以避免溢出。
结论
正确地使用 scanf
需要注意格式控制字符串的准确性,确保输入格式与期望匹配,以及处理好变量的地址传递。在实践中,多加练习和测试是理解和熟练掌握 scanf
使用的最佳方法。
3.5.5 字符输入输出函数
在 C 语言中,除了通用的 printf
和 scanf
函数用于数据的输入和输出,C标准库还提供了一些专用于字符处理的函数。这些函数简单易用,适用于处理单一字符的输入和输出任务。
1. 使用 putchar
函数输出字符
putchar
函数是用于输出单个字符到标准输出设备(通常是屏幕)的简便函数。它的函数原型非常简单:
int putchar(int c);
示例:连续输出字符
#include <stdio.h>
int main() {
char a = 'B', b = 'O', c = 'Y';
putchar(a); // 输出字符 B
putchar(b); // 输出字符 O
putchar(c); // 输出字符 Y
putchar('\n'); // 输出换行符
return 0;
}
运行结果将是:
BOY
2. 使用 getchar
函数输入字符
与 putchar
相对应,getchar
函数用于从标准输入(通常是键盘)读取单个字符。该函数不需要参数,并返回读取的字符。
示例:从键盘读取并输出字符
#include <stdio.h>
int main() {
char a, b, c;
a = getchar(); // 读取一个字符并存储到变量 a
b = getchar(); // 读取一个字符并存储到变量 b
c = getchar(); // 读取一个字符并存储到变量 c
putchar(a); // 输出字符 a
putchar(b); // 输出字符 b
putchar(c); // 输出字符 c
putchar('\n'); // 输出换行符
return 0;
}
输入“BOY”后按 Enter 键,屏幕将显示:
BOY
注意点:
-
getchar
在读取字符时不会自动忽略前面的空白字符,包括空格、制表符或换行符。这意味着如果上一条输入命令留下了换行符在输入缓冲区,getchar
将会读取它作为第一个字符。 -
连续调用
getchar
可以读取多个字符,但每次只处理一个字符,适用于读取有限长度的输入。
这些字符输入输出函数虽然功能单一,但在需要精确控制输入输出的场景中,它们比 printf
和 scanf
更为直接和高效。在实际编程中,根据需要选择合适的工具是非常重要的。