c语言输入字符串gets,【C语言】【笔记】字符串输入输出函数 | gets() | fgets() | gets_s() | scanf()...

“若是一个字符串读入程序,首先要预留存储该字符串的空间”

目录数组

gets()函数和puts()函数

gets()函数读取整行输入,直至遇到换行符,而后丢弃换行符,存储其他字符,并在这些字符末尾添加一个空字符,使其成为一个C字符串。blog

#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;

}

fb9c24abf9b6311ae36fa2171f057307.png

可是!!!gets()惟一的参数是数组名words,并不知道数组的长度。get

数组名表明数组首元素的地址,所以gets()只知道数组的开始出,并不知道数组中有多少个元素。若是输入的字符串过长会致使缓冲区溢出。io

所以,坚定禁止使用gets();class

fgets()函数和fputs()函数

该函数专门用于处理文件输入。

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;

}

输出以下:

ec2a11ec630ed1111aa203f654af6e2d.png

输出解释: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_s()和gets()几乎如出一辙,彻底能够替换!

scanf()函数

scanf()有两种方法肯定输入结束:%5s,读取5个字符或者读到第一个空白中止。

e178709809835fd9ac5322b3d746b8f7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值