当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。
当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。
1、格式化输入输出函数
C 语言中的 I/O (输入/输出) 通常使用
printf()
和scanf()
两个函数。
scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕)。
#include <stdio.h>
int main()
{
int num = 10086;
printf("%d\n",num);
scanf("%d",&num);
printf("%d\n",num);
}
printf():通过格式控制符%s输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据。
scanf():通过格式控制符%s输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以scanf() 不能输入带空格的字符串。
2、非格式化输入输出函数
2.1、getchar() 和 putchar() 函数
int getchar(void)
函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
int putchar(int c)
函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。
#include <stdio.h>
int main( )
{
int c;
printf( "请输入字符:");
c = getchar( );
printf( "输出的字符为: ");
putchar( c );
printf( "\n");
return 0;
}
运行结果如下
$./a.out
请输入字符:adadada
输出的字符为: a
这是由于缓冲区的读取特性,当用户由键盘键入字符时,计算机并不会马上处理,而会暂存到系统的缓冲区(Buffter)内。到按【Enter】键后,getchar()函数才会读入缓冲区的第一个字符。而其它字符继续保留在缓冲区,等待下一个读取字符/字符串的函数来读入。
getchar()常用在程序中暂停程序。
2.2、getche() 和 getch() 函数
getche()
: 该函数会由键盘输入一个字符,会立刻读取,并在屏幕上显示读入的字符。由于它并不读取缓冲区的字符,只要用户输入字符
getche()
:函数会立刻读取,而不需等待按【Enter】键。通常用于程序中只需用户输入一个字符,即可往下继续执行的情形。
getch()与getche()的区别是:getch()不需将所输入的字符显示到屏幕上。
例子:测试getch()与getche()
#include <stdio.h>
#include <conio.h> /* getche(), getch() */
int main()
{
char c1, c2;
printf("Press any key to exit");
c1 = getche();
putchar('\n');
printf("Press any key once more to exit");
c2 = getch(); //在输入字符的时候,屏幕上并看不到输入的字符
putchar('\n');
printf("The character getche() read: %c \n", c1);
printf("The character getch() read: %c \n", c2);
}
运行结果
$./a.out
Press any key to exit:a
Press any key once more to exit:
The character getche() read: a
The character getch() read: c
注意:getche() 和getch() 位于 conio.h 头文件中,不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。
对三个函数的总结:
函数 | 缓冲区 | 头文件 | 回显 | 适用平台 |
---|---|---|---|---|
getchar() | 有 | stdio.h | 有 | Windows、Linux、Mac OS 等所有平台 |
getche() | 无 | conio.h | 有 | Windows |
getch() | 无 | conio.h | 无 | Windows |
2.3、puts()和gets()函数
char *gets(char *s)
函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。
int puts(const char *s)
函数把字符串 s 和一个尾随的换行符写入到 stdout。
#include <stdio.h>
int main()
{
char s[50];
printf("Enter a string: ");
gets(s);
printf("The string you entered: ");
puts(s);
}
运行结果
$./a.out
Enter a string: hello word!
The string you entered: hello word!
注意:gets() 函数将接收输入的整个字符串直到回车为止,它不检查字符串的长度,可能会发生内存越界造成段错误,比较适合应用在多字符,中文字或长字符串的读取。。
puts()用来输出字符串,输出自动换行。当输出数据时,会以’\0’字符作为该字符串的结束。
2.4、fgets() 和 fputs()函数
char *fgets(char *s, int size, FILE *stream)
:可以指定接收的字符串长度,实际只能接收size-1字符,它会为’\0’预留一个位置,当输入的字符数不足size-1时会边回车符一起接收。
int fputs(const char *s, FILE *stream)
:把字符串写入到指定的流 stream 中,但不包括空字符。
#include <stdio.h>
int main()
{
char c[100];
printf("Enter a value:");
fgets( c,100,stdin );
printf("\nyou entered:");
fputs( c,stdout );
return 0;
}
运行结果:
$./a.out
Enter a value:hello
you entered:hello
对fgets()函数有两点说明:
1、在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2、fgets函数也有返回值,其返回值是字符数组的首地址。
对fgets()函数的说明:
与puts()函数不同的,fputs()函数打印的时候并不添加一个换行符。
2.5、getc()和putc()函数
另外还有一组输入输出函数是
getc()
和putc()
,它们的作用也是输入和输出一个字符
#include <stdio.h>
void main()
{
int ch;
FILE *pfin = stdin; //定义一个文件指针,并指向标准输入设备(键盘)
FILE *pfout = stdout; //定义一个文件指针,并指向标准输出设备(屏幕)
printf("Enter a string: ");
ch = getc(pfin); //使用getc()函数获取缓冲区中的第一个字符
putc(ch, pfout); //使用putc()函数输出该字符
putc('\n', pfout); //使用putc()函数输出换行字符
}
运行结果:
$./a.out
Enter a string: Testing!
T
Press any key to continue