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

一、字符串输入
想把字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串。需要分配足够大的存储区来存放希望读入的字符串,不要指望计算机读的时候会先计算字符串的长度,然后为字符串分配空间。常见错误为:
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()也不为输出添加新的换行符。

引用块内容

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值