字符串输入与输出
1.gets( )函数(和puts())
gets( )函数简单易用,它读取整行输入,直至遇到换行符,然后丢掉换行符,存储其余字符,并在这些字符的末尾添加一个空字符使其成为字符串。它经常和puts( )函数配对使用,该函数用于显示字符串,并在这些字符的末尾添加换行符。
但是,gets( )函数只知道数组的开始处,并不知道数组中有多少个元素。如果输入的字符串过长,会导致缓冲区溢出,即多余的字符超出了指定的目标空间。如果多余的字符只是占用了未被使用的内存,就不会立即出现问题;如果他们擦写掉程序中的其他数据,会导致程序异常终止,或者还有其他情况。所以很多人都在建议抛弃gets( )函数。
gets( )的替代品gets_s( ),它是stdio.h输入输出函数系列中的可选扩展,所以支撑C11的编译器也不一定支撑它。
2.fgets( )函数(和fputs( ))
fgets()函数通过第二个参数限制读入的字符数来解决溢出的问题。该函数专门设计用于处理文件输入,所以一般情况可能不太好用。fgets()和fgets()的区别如下。
- fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数数的值是N,那么fgets()将读入N-1个字符,或者遇到第一个换行符为止。
- 如果fgets()读到一个换行符,会把它存储在字符串中。这点与gets()不同,gets()会丢弃掉换行符。
- fgets()函数的第3个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识定义在stdio.h中。
注意:fgets()函数返回指向char的指针。如果一切顺利的话,该函数返回的地址与传入的第1个参数相同。但是,如果函数读到文件结尾,它将返回一个特殊的指针:空指针。该指针保证不会指向有效的数据,所以可用于标识这种特殊情况。在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替更常见。
#include <stdio.h>
int main()
{
char word[10];
while(fgets(word,10,stdin)!=NULL&&word[0]!='\n')
fputs(word,stdout);
}
如以上代码,虽然fgets只读入9个字符,但是该程序似乎在处理过长的输入时完全没有问题。
系统使用缓冲的I/O。这意味着用户在按下Return键之前,输入都被存储在临时存储区(缓冲区)中。按下Return键就在输入中增加一个换行键,并把整行输入发送给fgets()。对于输入,fputs()把字符发送给另一个缓冲区,但发送换行符时,缓冲区中的内容被发送至屏幕上。
2.gets_s函数
gets_s()与fgets()的区别如下
- gets_s()只从标准输入中读取数据,所以不需要第3个参数。
- 如果gets_s()读到换行符,会丢弃它而不是存储它。
- 如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着调用依赖实现的“处理函数”(或者你选择的其他函数),可能会终止或退出程序。
3.puts()
- puts()函数很容易使用,只需把字符串的地址作为参数转递给它即可。
- puts()在显示字符串时会自动在末尾添加一个换行符。
- puts()再遇到空字符时停止输出,所以必须确保有空字符。
4.fputs()
fputs()函数是puts()针对文件定制的版本,他们的区别如下。
- fputs()函数的第2个参数指明要写入数据的文件。如果要打印在显示器上,可以用定义在stdio.h中的stdout作为参数。
- 与puts()不同,fputs()不会在输出的末尾添加换行符。
提醒:
char *word;
while(*word) //与*word!='\0'相同
if(word) //与word!=NULL相同,NULL即读到文件结尾或出现读取错误