6.1 字符串输入/输出
在程序当中,经常需要在程序运行过程中打印出一些信息,将其输出显示到标准输出设备 stdout(譬如屏幕)或标准错误设备 stderr(譬如屏幕),譬如调试信息、报错信息、中间产生的变量的值等等,以实现对程序运行状态的掌控和分析。
有时程序在运行过程中还需要从标准输入设备 stdin(譬如键盘)中读取字符串,将读取到的字符串进行解析,以指导程序的下一步动作、控制程序执行流程。
6.1.1字符串输出
常用的字符串输出函数有 putchar()、puts()、fputc()、fputs()。我们经常使用 printf()函数来输出字符串信息,原因在于 printf()可以按照自己规定的格式输出字符串信息,一般称为格式化输出。但是在实际编程中, putchar()、 puts()、 fputc()、 fputs()这些库函数在使用上方便、简单。
putchar()、puts()、fputc()、fputs()这些函数也是标准 I/O 函数,属于标准 C 库函数,所以需要包含头文件<stdio.h>,并且它们也使用 stdio 缓冲
puts()函数
puts()函数用来向标准输出设备(屏幕、显示器)输出字符串并自行换行。把字符串输出到标准输出设备,将' \0 '转换为换行符' \n '。
#include <stdio.h>
int puts(const char *s);
函数参数
s:需要进行输出的字符串。
返回值:
成功返回一个非负数;失败将返回 EOF,EOF 其实就是-1。
使用 puts()函数内部会自动在其后添加一个换行符。所以,如果只是单纯输出字符串到标准输出设备,而不包含数字格式化转换操作,那么使用 puts()会更加方便、简洁
putchar()函数
putchar()函数可以把参数 c 指定的字符(一个无符号字符)输出到标准输出设备,其输出可以是一个字符,可以是介于 0~127 之间的一个十进制整型数(包含 0 和 127,输出其对应的 ASCII 码字符),也可以是用 char 类型定义好的一个字符型变量。
#include <stdio.h>
int putchar(int c);
/*函数参数
c:需要进行输出的字符。
返回值:
出错将返回 EOF。*/
fputc()函数
与 putchar()类似,也用于输出参数 c 指定的字符(一个无符号字符),与 putchar()区别在于,putchar()只能输出到标准输出设备,而 fputc()可把字符输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。
#include <stdio.h>
int fputc(int c, FILE *stream);
函数参数
c:需要进行输出的字符。
stream:文件指针。
返回值:
成功时返回输出的字符;出错将返回 EOF。
fputs()函数
与 puts()类似,也用于输出一条字符串,与 puts()区别在于,puts()只能输出到标准输出设
备,而 fputs()可把字符串输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。
#include <stdio.h>
int fputs(const char *s, FILE *stream);
函数参数
s:需要输出的字符串。
stream:文件指针。
返回值:
成功返回非负数;失败将返回 EOF。
6.1.2字符串输入
常用的字符串输入函数有 gets()、getchar()、fgetc()、fgets()。scanf()与这些函数相比,在功能上确实有它的优势,但是在使用上不如它们方便、简单、更易于使用。
gets()、getchar()、fgetc()、fgets()这些函数也是标准 I/O 函数,属于标准 C 库函数,所
以需要包含头文件<stdio.h>,并且它们也使用 stdio 缓冲。
gets()函数
用于从标准输入设备(譬如键盘)中获取用户输入的字符串。不管我们输入的是空格、单引号、双引号都会作为 gets()获取到的字符串的一部分,直到用户输入回车换行符结束。
#include <stdio.h>
char *gets(char *s);
函数参数
s:指向字符数组的指针,用于存储字符串。
返回值:
如果成功,该函数返回指向 s 的指针;
如果发生错误或者到达末尾时还未读取任何字符,则返回 NULL。
用户从键盘输入的字符串数据首先会存放在一个输入缓冲区中。gets()函数会从输入缓冲区中读取字符串存储到字符指针变量 s 所指向的内存空间,当从输入缓冲区中读走字符后,相应的字符便不存在于缓冲区了。
输入的字符串中就算是有空格也可以直接输入,字符串输入完成之后按回车即可,gets()函数不检查缓冲区溢出。
getchar 函数
用于从标准输入设备中读取一个字符(一个无符号字符)。
#include <stdio.h>
int getchar(void);
无需传参。
返回值:
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,
如果到达文件末尾或发生读错误,则返回 EOF。
getchar()只从输入缓冲区中读取一个字符,与 scanf 以%c 格式读取一样,空格、TAB 制表符、回车符都将是正常的字符。即使输入了多个字符,但 getchar()仅读取一个字符。
fgets 函数
与 gets()一样用于获取输入的字符串。
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
/*函数参数:
s:指向字符数组的指针,用于存储字符串。
size:这是要读取的最大字符数。
stream:文件指针。*/
fgets()与 gets()的区别主要是三点:
⚫ gets()只能从标准输入设备中获取输入字符串,而 fgets()既可以从标准输入设备获取字符串、也可以从一个普通文件中获取输入字符串。
⚫ fgets()可以设置获取字符串的最大字符数。
⚫ gets()会将缓冲区中的换行符'\n'读取出来、将其丢弃、将'\n'替换为字符串结束符'\0';fgets()也会将缓冲区中的换行符读取出来,但并不丢弃,而是作为字符串组成字符存在,读取完成之后自动在最后添加字符串结束字符'\0'。
使用 fgets()读取文件中输入的字符串,文件指针会随着读取的字节数向前移动。
fgetc 函数
与 getchar()一样,用于读取一个输入字符。
#include <stdio.h>
int fgetc(FILE *stream);
/*函数参数:
stream:文件指针。
返回值:
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,
如果到达文件末尾或发生读错误,则返回 EOF。*/
getc 可以指定输入字符的文件,既可以从标准输入设备输入字符,也可以从一个普通文件中输入字符,其它方面与 getchar 函数相同。