|
第4章 标准输入/输出 |
|
为了使用户能够与程序内部实现良好的交互性,C语言提供了一套完整的输入/输出功能。其中,包括用户常用的输入/输出函数scanf()和printf()等。用户通过C语言标准输入/输出函数,可以向程序内部输入数据,经过程序处理后,再由输出函数将处理结果输出显示。由此看来,掌握C语言标准输入/输出操作是程序设计成功的一个重要步骤。本章将详细介绍输入/输出函数的相关功能及其使用方法。
在C语言中,标准输入是指用户可以通过相关的函数实现从计算机输入设备中获取数据的功能。通常情况下,计算机的输入设备包括键盘、扫描仪等相关设备。用户只有熟悉标准输入函数的用法后,才能够准确地使用其实现数据获取功能。本节将介绍C语言标准输入函数的相关基础知识。
scanf()是C语言中最为常用的标准输入函数。其功能主要是从计算机的输入流中获取相应的数据,并将获取到的数据保存在用户指定的变量或者内存中。用户在使用函数scanf()时,需要使用输入控制符控制数据的获取。本小节将向用户讲解输入函数scanf()的使用原型。
在C语言中,标准输入函数scanf()有两个参数,并且根据参数的不同,该函数可以获取到不同类型的数据。该函数的原型如下:
int scanf(const char*format, ch); //输入函数scanf的使用原型
当该函数调用成功时,将返回获取到数据的个数。否则,该函数将返回0。其中,参数的具体含义如下。
1. 参数format
该参数表示了格式控制符,主要用于控制获取数据的类型。当然,该参数也可以是一个格式控制符的组合字符串。其具体取值如表4.1所示。
例如,可以将参数format设置为c%,则表示将获取计算机输入流中的单字符数据。获取十进制数据时,将该参数修改为d%即可。
注意 该参数可以被设置为多个格式控制符的组合。
2. 参数ch
该参数标识了一个已经定义的变量,即将获取到的数据放到该参数所指向的变量地址中进行保存。那么,用户就需要使用取地址运算符“&”。
由于标准输入函数scanf()是C语言所提供的库函数,所以编程时还需要将相应的头文件包含到实例程序的工程中。
通常,用户可以使用关键字include将指定的头文件包含到程序中,并且标准输入函数scanf()的定义和实现均包含在头文件“stdio.h”中。所以,用户将该头文件包含到实例程序中,具体代码如下:
#include<stdio.h> //包含相应的头文件
…… //省略部分代码
在上面的代码中,用户使用关键字include将系统头文件“stdio.h”包含到程序中,后面介绍的标准输出函数printf也是包含在该头文件中的。
注意 用户在包含头文件时,若头文件为系统定义的,则需要使用尖括号“<>”将文件名括起来;若头文件为自定义的,则使用双引号将文件名括起来。
在前面小节中已经介绍了标准输入函数scanf()的使用原型及其使用方法。用户可以通过具体的实例程序对函数scanf的使用方法进行深入学习。例如,用户可使用该函数获取不同类型的数据,并将这些数据输出,具体的代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
int ch; //定义整型数据变量
char ch1; //定义字符变量
printf("请输入十进制数据:\n"); //输出提示语
scanf("%d",&ch); //获取输入数据
printf("请输入单字符数据:\n");
scanf("%s",&ch1);
printf("用户输入的十进制数据是:\n");
printf("%d\n",ch); //输出数据变量值
printf("用户输入的字符数据是:\n");
printf("%c\n",&ch1);
return 0; //程序正常结束
}
在上面的实例中,主要是使用输入函数scanf()获取数据输入流中的整型数据以及字符数据,并且将获取到的数据保存到指定的变量中。该实例程序运行结果如图4.1所示。
图 4.1 程序运行结果
注意 标准输入函数scanf()获取数据时,是以回车符作为结束标识符的。因此,当用户输入数据完成后,单击回车键即可完成数据获取。
与标准输入功能相对应的是标准输出功能。在C语言中,标准输出的主要作用是将程序处理后的结果或者一些错误提示信息输出到屏幕上进行显示。输出功能也是程序交互性中一个重要的部分,所以,本节将介绍与标准输出相关的基础知识。
printf()与scanf()一样,含有两个参数,并且参数的含义也是相同的。该函数的原型如下:
int printf(const char*format, ch); //标准输出函数
该函数调用成功,则返回实际输出数据的个数;否则,将返回0。其中,具体的函数意义如下。
1. 参数format
该参数表示输出格式控制符,主要是控制输出字符的格式。其取值如表4.1所示。
注意 用户在输出信息字符串时,如果需要换行,则可以使用控制符“\n”。
2. 参数ch
该参数表示将要输出的变量。一般情况下,用户不需要使用取地址运算符“&”与该参数一起使用。
注意 在实际编程时,如果用户需要直接输出一串字符,则可以将该参数省略掉。
与标准输入函数scanf()一样,用户使用函数printf()之前,应当将其头文件“stdio.h”包含到实例程序中。这样,用户才能够正确地使用该函数。
例如,用户在程序中要将一个字符型的数据输出到计算机屏幕上显示,则需要将函数printf的第一个参数修改为“%c”。具体的代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
char ch; //定义字符变量
printf("请用户输入一个字符\n"); //输出提示语
scanf("%c",&ch); //获取用户输入的字符数据
printf("用户输入的字符为:\n"); //输出提示语
printf("%c\n",ch); //输出字符变量值
return 0;
}
在实例程序中,程序要求输入一个字符数据,然后再通过输出函数printf()将该字符变量值输出显示。程序运行的结果如图4.2所示。
图 4.2 实例程序运行结果
如果需要将其他类型的数据输出,则直接修改输出函数printf()的格式控制符即可。例如,需要输出整型数据,则将格式控制符修改为“%d”。关于具体的格式控制符取值,可以参考表4.1。
在C语言中,可以使用不同的控制符输出不同格式的数据。例如,当用户需要输出字符串类型的数据时,可以使用输出控制符“%s”。而当用户输出单个字符时,需要使用输出控制符“%c”。在本小节中,将通过实例程序的编写详细地讲解各种输出控制符的作用及其使用方法等。
例如,用户使用各种输出控制符输出不同类型的数据,并且通过改变输出控制符的格式改变输出数据的输出格式。具体的代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数
{
int i=12; //定义并初始化整型变量
float f=15.54564; //定义并初始化单精度变量
double d=14.554574564646; //定义并初始化双精度变量
char a="C"; //定义并初始化字符变量
char ch[10]="学习C++语言"; //定义并初始化字符数组变量
printf("输出整型数据:\n"); //输出提示语
printf("%d\n",i); //输出整型数据
printf("输出单精度类型的数据:\n");
printf("%f\n",f); //输出单精度数据
printf("输出双精度类型的数据:\n");
printf("%1f\n",d); //输出双精度数据
printf("输出字符型数据:\n");
printf("%c\n",a); //输出单个字符数据
printf("输出字符串型数据:\n");
printf("%s\n",ch); //输出字符串数据
return 0; //程序正常结束
}
在上面的代码中,用户分别使用了不同的输出控制符对不同类型的数据输出显示。通过程序运行后的显示结果说明各种输出控制符的作用等。程序运行后的结果如图4.3所示。
图 4.3 程序运行结果
如图4.3所示,用户可以看到,在程序中使用了不同的输出控制符将会显示不同类型的数据。当然,用户也可以将原代码中的各个输出控制符进行交换后,再运行程序。此时,修改后的程序在编译和运行时,可能将出现严重的错误。
注意 使用输出控制符时应当非常小心,使用不当时容易造成内存溢出等严重问题。
在C语言中,与标准输入/输出功能函数相对应的一组输入/输出功能函数是getchar()和putchar()。这两个功能函数的作用也是输入和输出数据。但是,与前面的标准输入/输出不同,getchar()和putchar()只能够获取单个输入数据和输出单个数据。本节将讲解这两个函数的使用方法。
getchar()是C语言中用于获取单个输入数据的功能函数。即当用户在程序中输入一串字符时,该函数也只能够获取到输入的第一个字符数据,而后面的字符将被省略。该函数的使用原型如下:
int getchar(void); //获取单个数据
如果该函数调用成功,则将返回获取到的数据;否则,将返回0。例如,在程序中使用getchar()获取输入数据,并将数据输出显示。具体的代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
char ch; //定义字符变量
printf("请用户输入一个字符\n"); //输出提示语
ch=getchar(); //获取用户输入的字符数据
printf("用户输入的字符为:\n"); //输出提示语
printf("%c\n",ch); //输出字符变量值
return 0;
}
在实例程序中,当getchar()获取到用户输入的数据后,会将该数据存放在变量ch中,并通过标准输出函数printf()输出,如图4.4所示。
图 4.4 程序运行结果
当然,函数getchar()不仅能够获取整型数据、字符数据,还可以获取其他任何类型的数据。虽然该函数的功能十分有限,但是也可以使用该函数结合循环结构实现多数据的获取功能。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
char ch[10]={0}; //定义并初始化字符数组
printf("请用户输入10个字符数据!\n"); //输出提示语
for(int i=0;i<10;i++) //循环结构
{
ch[i]=getchar(); //使用getchar函数获取数据
}
printf("用户输入的数据为:%s\n",ch); //输出获取到的数据
return 0;
}
在实例代码中,主要使用一个for循环结构使函数getchar()被调用了10次,并且每次调用后,将获取到的数据保存在字符数组ch中。当循环结束后,使用标准输出函数printf()将数据输出显示,运行结果如图4.5所示。
如图4.4所示,用户输入了11个数据,但是程序根据循环次数只接收了10个数据,并输出显示。因此,当函数getchar()与循环结构结合使用时,也可以实现与标准输入函数一样的功能。
注意 关于for循环结构的使用方法将在第5章中进行详细讲解。
图 4.5 程序运行结果
与函数getchar()功能相反的函数是putchar()。该函数只能够向计算机输出设备输出一个数据,并且该函数也可以在循环结构中使用。该函数的使用原型如下:
int putchar(int c); //输出单个数据
在该函数中,含有一个参数c,表示存放输出数据的变量标识符。如果该函数调用失败,将返回错误标识符EOF。例如,用户将获取到的数据使用函数putchar()输出,具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
char ch[10]={0}; //定义并初始化字符数组
printf("请用户输入10个字符数据!\n"); //输出提示语
for(int i=0;i<10;i++) //循环结构
{
ch[i]=getchar(); //使用getchar函数获取数据
}
printf("输出的数据如下所示:\n"); //输出提示语
for(int i1=0;i1<10;i1++) //循环结构
{
putchar(ch[i1]); //使用putchar函数获取数据
putchar(0); //输出空格
}
printf("\n"); //输出换行符
return 0;
}
在实例程序中,用户使用了函数putchar()结合循环结构实现字符数组数据的输出显示功能。在代码中,代码段“putchar(0);”表示使用该函数输出一个空字符,即一个空格。程序运行后的结果如图4.6所示。
如图4.5所示,字符数组中的数据在输出时用空格分开。当函数putchar()的数据源不是多个数据时,则用户不能够将该函数使用在一个循环结构中。否则,程序将输出乱码数据。
图 4.6 实例程序运行结果
注意 用户不能够使用输出函数putchar()直接输出一串数据,否则将出现编译错误。
通过前面对标准输入/输出函数和相关函数的学习,用户已经熟悉了这些函数的功能及其使用方法。所以,本节将使用前面所介绍的输入/输出函数编写实例程序,并对其中的知识点进行讲解。例如,在一个班级中,教师需要输入学生的相关信息,如学生姓名、学号、家庭住址等信息。经过程序处理之后,将这些信息整理并输出显示。具体代码如下:
#include<stdio.h> //包含标准输入/输出头文件
main() //主函数开始
{
char name[25]; //定义字符数组,表示学生姓名
char num[10]; //定义学生学号
char addr[30]; //定义学生家庭地址
int i=0; //定义并初始化整型变量
printf("请输入学生姓名:\n"); //输出提示语
scanf("%s",&name); //获取用户输入的数据
printf("请输入学生学号:\n"); //输出提示语
scanf("%s",&num); //获取用户输入的学生学号
printf("请输入学生家庭住址:\n"); //输出提示语
scanf("%s",&addr); //获取学生的家庭地址数据
while(i<10) //while循环结构
{
printf("正在处理……\n"); //输出提示语
i++; //使循环变量i自加1
}
printf("学生姓名:%s\n",name); //输出学生姓名
printf("学生学号:%s\n",num); //输出学生学号
printf("学生家庭住址:%s\n",addr); //输出学生家庭住址
printf("按任意键结束程序运行。\n"); //输出提示语
getchar(); //调用getchar获取任意输入数据
return 0; //程序正常结束
}
在实例程序中,用户定义了三个字符数组变量,分别表示学生的姓名、学号以及家庭住址信息,并且通过标准输出函数输出相应的提示语。这样,用户就可以根据提示语输入程序所需要的数据。在代码段中,使用了一个while循环结构循环输出字符串“正在处理……”,用于模拟正在进行的运算处理。
当应用程序结束时,直接使用标准输出函数printf()输出学生的相关信息,并使用函数getchar()获取用户输入的任意数据,结束应用程序。程序运行后的结果如图4.7所示。
图 4.7 实例程序运行结果
如图4.6所示,程序运行结束后,将输出提示语“按任意键结束程序运行。”,此时,用户输入任意键都会结束程序的运行。
本章主要介绍了C语言标准输入/输出函数的原型以及使用方法等,并通过编写实例程序具体讲解了输入/输出函数的具体使用方法以及编程中可能会遇到的问题的解决方法。最后,还重点介绍了输入/输出函数getchar()和putchar()的功能及其功能程序的编写方法。
在本章的学习中,其重点在于如何将C语言标准输入/输出函数的头文件包含到实例程序中,并且能够正确地使用这些函数实现相应的功能。其难点在于如何区分C语言标准输入/输出函数与函数getchar()和putchar()之间的区别和联系。
通过本章的学习,读者应当熟悉C语言标准输入/输出函数的功能和具体功能的实现方法,并且能够深入地学习如何实现并完善输入/输出功能的方法。在第5章中,将介绍关于C语言控制结构方面的相关知识。
1. 定义一个大小为6的字符数组变量ch,使用格式化输入方式从输入数据流中获取一个字符串,并保存在变量ch中,然后通过printf输出字符数组中的数据。
2. 定义一个字符变量ch,试使用函数getchar获取输入流中的字符,并使用该字符对变量ch进行初始化。
3. 将第2小题中的字符变量ch的值使用函数putchar输出。
4. 编写程序实现以十进制格式获取一个数据,然后按照八进制格式对其输出。