字符串输入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);
头文件
函数说明
gets()(代表get string)函数对于交互式程序非常方便。从系统标准输入设备(通常是键盘)获得一个字符串,读字符串直到遇到一个换行符
返回值
读入成功,返回的指针与传递给它的是用一指针;
读入出错或遇到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:文件指针,将要读取的文件流。
头文件
函数说明
从文件指针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个字符(算上
二、字符串输入
1、puts()
函数原型
int puts(char *string);
头文件
函数说明
puts()函数用来向标准输出设备(屏幕)写字符串并换行,其调用格式为:puts(s);其中s为字符串变量(字符数组名或字符串指针);其作用与printf(“%s\n”, s);相同。
注意事项
①、每个字符串以单行显示,在显示时自动在其后增加一个换行符;
②、遇到’\0’即字符串结束符时才停止输出,应确保字符串有空字符存在;
③、只能输出字符串,不能是数值或进行格式转换。
常见错误
2、fputs()
函数原型
int fputs(const char *str, FILE *fp);
参数
str是字符型指针,可以是字符串常量,或者存放字符串的数组首地址;
fp是文件型指针,通过打开文件函数fopen()获得的。
头文件
函数说明
fputs()向指定的文件写入一个字符串。成功写入一个字符串后,文件的位置指针会自动后移,函数返回为一个非负整数;否则返回EOF(符号常量,其值为-1)。
注意事项
缓冲区str中保存的是以
gets()丢掉输入里的换行符,但puts()为输入增加换行符。fgets()存储输入中的换行符,而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()也不为输出添加新的换行符。
引用块内容
相关文章推荐
- 博客内容笔记
- JAVA基础知识(持续更新ing)
- 线程的阻塞以及优化
- 传智播客javase总结 9
- 正则表达式的威力5_网页爬虫,爬邮件地址
- Java通过JNI调用C++程序
- 102、Binary Tree Level Order Traversal
- mac电脑下将没有做git管理的代码使用github和sourceTree进行代码管理
- 网站访问细节
- hdu 2063 过山车 二分匹配+hk算法
- iOS高效开发必备的10款Objective-C类库
- Delphi 取外网IP
- Tour(KM算法)
- linux下chown的用法
- kai-linux 实现MITM攻击
- leetcode 76:Minimum Window Substring
- 1、Two Sum
- Delphi 服务操作
- C++第十五课 文件
- 20151126