您的位置:首页 > 其它

字符串输入gets()、fgets()和字符串输出puts()、fputs()函数

2015-11-26 22:42 281 查看
一、字符串输入

想把字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串。需要分配足够大的存储区来存放希望读入的字符串,不要指望计算机读的时候会先计算字符串的长度,然后为字符串分配空间。常见错误为:

char *name;

scanf(“%s”, name);

这可能会通过编译,但在读入name的时候,name会覆盖程序中的数据和代码,并可能导致程序的异常终止。这是因为scanf()把信息复制到由参数给定的地址中,而在这种情况下,参数是个未初始化的指针;name可能指向任何地方。

解决方法

最简单的方法是在声明时明确指出数组大小: char name[81];或者使用C库里分配存储空间的函数。

1、gets()

函数原型

char *gets(char *s);

头文件

#include <stdio.h>


函数说明

gets()(代表get string)函数对于交互式程序非常方便。从系统标准输入设备(通常是键盘)获得一个字符串,读字符串直到遇到一个换行符
('\n')
结束。它将读取换行符但将其丢弃,然后在这些字符后增加一个空字符
('\0')


返回值

读入成功,返回的指针与传递给它的是用一指针;

读入出错或遇到EOF(End-Of-File),返回NULL指针。在返回NULL指针时,要判断是发生错误还是遇到EOF。

注意事项

本函数可以无限读取,不会判断上限,所以程序员要保证目标数组能够容纳输入,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。以前就有人注意到一些UNIX操作系统代码使用gets(),于是他们利用这个弱点,用很长的输入覆盖操作系统的代码,从而发明了在UNIX网络上传播的“蠕虫(worm)”病毒。那些系统代码后来被不使用gets()的代码所代替。因此对于重要的编程,应使用fgets()而不是gets()。

2、fgets()

函数原型

char *fgets(char *buf, int bufsize, FILE *stream);

参数

*buf :字符型指针,指向将存储到的数据地址;

bufsize:整型数据,指明buf指向的字符数组的大小;

*stream:文件指针,将要读取的文件流。

头文件

#include <stdio.h>


函数说明

从文件指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋’\0’),如果文件中的该行,不足bufsize个字符,则读完该行就结束。

返回值

如果函数读取成功,则返回指针buf;

失败或读到文件结尾则返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

注意事项

①、它需要第二个参数bufsize来说明最大读入字符数,fgets()会读取最多bufsize - 1个字符或读完一个换行符为止,由这二者中最先满足的那个来结束输入;

②、如果fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它;

③、第三个参数来说明读哪一个文件。从键盘上读数据时,可以用stdin作为该参数,这个标识符在stdio.h中定义。

④、如果使用fgets()读取某个文件,第一次读取的bufsize为5,而文件的第一行有10个字符(算上
'\n'
),那么读取文件的指针会偏移至当前读取完的这个字符之后的位置。也就是第二次再用fgets()读取文件的时候,则会继续读取其后的字符。而如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的
'\n'
换行,一个保存字符串本身的结束标识
'\0'
),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。

二、字符串输入

1、puts()

函数原型

int puts(char *string);

头文件

#include <stdio.h>


函数说明

puts()函数用来向标准输出设备(屏幕)写字符串并换行,其调用格式为:puts(s);其中s为字符串变量(字符数组名或字符串指针);其作用与printf(“%s\n”, s);相同。

注意事项

①、每个字符串以单行显示,在显示时自动在其后增加一个换行符;

②、遇到’\0’即字符串结束符时才停止输出,应确保字符串有空字符存在;

③、只能输出字符串,不能是数值或进行格式转换。

常见错误

#include <stdio.h>
int main()
{
char a[] = {'H','I','!','!'};
puts(a);
}


则输出Hi!!@6���6��նy(后面都是乱码)
原因:a在结尾处缺少一个空字符('\0'),所以它不是一个串,这样,puts()就不知道什么时候停止输出,它将会把a后面内存单元中的内容都打印出,直到它在什么地方碰到了一个空字符为止。


2、fputs()

函数原型

int fputs(const char *str, FILE *fp);

参数

str是字符型指针,可以是字符串常量,或者存放字符串的数组首地址;

fp是文件型指针,通过打开文件函数fopen()获得的。

头文件

#include <stdio.h>


函数说明

fputs()向指定的文件写入一个字符串。成功写入一个字符串后,文件的位置指针会自动后移,函数返回为一个非负整数;否则返回EOF(符号常量,其值为-1)。

注意事项

缓冲区str中保存的是以
'\0'
结尾的字符串,fputs将该字符串写入文件fp,但并不写入结尾的
'\0'
;fputs()并不为输入自动增加换行符。

gets()丢掉输入里的换行符,但puts()为输入增加换行符。fgets()存储输入中的换行符,而fputs()也不为输出添加新的换行符。

引用块内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: