目录
gets()函数和puts()函数
fgets()函数和fputs()函数
gets_s()函数
scanf()函数
gets()函数读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符末尾添加一个空字符,使其成为一个C字符串。
#include
char *gets( char *str );
puts()函数显示字符串,并在末尾添加换行符,成功返回非负值,失败返回EOF。puts(words)相当于printf("%s\n",words)
#include
int puts( char *str );
/*示例程序*/
#include
int main()
{
char s[100];
gets(s);
puts(s);
return 0;
}
但是!!!gets()唯一的参数是数组名words,并不知道数组的长度。
数组名代表数组首元素的地址,因此gets()只知道数组的开始出,并不知道数组中有多少个元素。如果输入的字符串过长会导致缓冲区溢出。
因此,坚决禁止使用gets();
该函数专门用于处理文件输入。
fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数是n,那么fgets()读入n-1个字符,或者遇到第一个换行符为止。如果fgets()函数读到一个换行符,会把换行符存储在字符串中(和gets()区别)。
fgets()函数的第3个参数指明要读入的文件。如果是从键盘输入,将stdin(标准输入)作为参数。
fgets()函数返回指向char的指针。如果正常读入,返回的地址和传入的第1个参数相同。如果读入异常,返回空指针(C语言中用宏NULL来表示)
#include
char *fgets( char *str, int num, FILE *stream );
fputs()函数,它不会在末尾添加换行符。如果是从屏幕输入,将stdout(标准输出)作为参数。
#include
int fputs( const char *str, FILE *stream );
/*循环读入用户输入的内容,直至fgets()读到文件结尾*/
#include
while(fgets(words,10,stdin)!=NULL)
/*示例输出程序*标准输入输出*/
#include
int main()
{
char s[100];
fgets(s,100,stdin);
fputs(s,stdout);
return 0;
}
输出如下:
输出解释:fgets()一次读入“Hello World!”并存储为“Hello World!\n”
接着fputs()打印该字符串,并且未换行。
如何处理掉换行符?
遍历字符串,遇到换行符,并将其替换成空字符。遇到空字符,就丢弃输入行剩余的字符。
为什么要丢弃过长输入行中的余下字符?
输入行中多出来的字符会被留在缓冲区中,成为下一次读取语句的输入。
/*读取整行输入并用空字符代替换行符,或者读取部分输入,并丢弃其余部分*/
char * s_gets(char *st,int n)
{
char *ret_val;
int i=0;
ret_val = fgets(st,n,stdin);
if(ret_val!=NULL)
{
while(st[i]!='\n' && st[i]!='\0')
i++;
if(st[i]=='\n')
st[i]='\0';
else
while(getchar()!='\n')
continue;
}
return ret_val;
}
gets_s()只从标准输入中读取数据,所以不需要第三个参数。并且gets_s()读到换行符会丢弃它而不是存储它。
如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或者文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”,可能会中止或退出程序。
以上的特性说明,只要输入行未超过最大字符数,gets_s()和gets()几乎一模一样,完全可以替换!
scanf()有两种方法确定输入结束:%5s,读取5个字符或者读到第一个空白停止。