c语言 fgets字符个数,C语言字符串读取函数 gets()与fgets()

在c语言中读取字符串有多种方法,好比scanf() 配合%s使用,可是这种方法只能获取一个单词,即遇到空格等空字符就会返回。若是要读取一行字符串,好比:web

I love BIT数组

这种状况,scanf()就无能为力了。这时咱们最早想到的是用gets()读取.svg

gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’\n’,它会吧换行符替换成空字符’\0’,做为c语言字符串结束的标志。函数

gets()函数常常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志’\n’ui

#include

#include

//读取带有空格的字符串而且按空格分割

int main()

{

char str[1000];

const char *d = " ";

while (gets(str) != NULL) {

printf("%s\n", str);

char *p;

p = strtok(str, d);

while(p) {

printf("%s\n", p);

p = strtok(NULL, d);

}

}

return 0;

}

gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否可以装的下输入行

好比:spa

咱们定义了一个数组char src[5],这时候咱们调用gets(src),来从标准输入读取字符串,咱们看到gets()函数的参数为数组名,咱们都知道,数组名就至关于一个指针,也就是数组的首地址。这时若是咱们的输入大于5个字符,好比 I love BIT,gets()函数会从src所指地址开始,依次填入每一个字符,可是src只分配了5个字节的空间,填满这五个空间后,gets()函数就会访问未被分配的内存空间,若是这片空间已经存有数据,这时程序就会发生错误,而中断。指针

正式因为gets()函数的这个缺陷,在C99标准中,已经再也不建议使用gets()函数,而在C11中更是直接抛弃了这个函数。code

其实咱们能够用c语言中的fgets()函数来代替gets()xml

咱们先看一下函数原型声明:内存

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

注意一下第二个参数bufsize,这个参数就限制了读取的字符的个数,这就能够解决gets()函数的缺陷。

咱们知道fgets() 函数主要用于读取文件,若是要读取键盘,则stream参数应该为stdin。

须要注意的是,若是bufsize设置为n,那么fgets()函数最多读取n-1个字符,之因此用“最多”这个词是由于,若是在以前遇到了换行符,fgets函数也会返回。

还有一点就是,fgets()函数会读取换行符(这一点和gets函数不一样),当读取结束后,fgets函数会为buf在末尾添加一个空字符做为字符串的结束。

能够看一个简单的小例子:

#include

#include

#define LEN 6

int main(int argc,char* argv[])

{

char src[LEN];

printf("please enter:\n");

fgets(src,LEN,stdin);

printf("your enter is:\n");

fputs(src,stdout);

}

在这个程序中,我把数组的长度设置为6,先看一组输入和输出:

please enter:

zhan

you enter is:

zhan

Press any key to continue

输入为zhan和回车(’\n’),一共五个字符,fgets会读取这五个字符,而后在末尾添加字符串结束标志’\0’;

咱们知道fputs()函数并不会自动添加换行,可是输出结果却换行输出了Press any….,这就说明了fgets()函数是会读取换行符的。

在看一组输入输出:

please enter:

zhang

you enter is:

zhangPress any key to continue

此次我输入了zhang和回车换行,fgets函数依然是读取5个字符(LEN-1个),这时fgets()读入zhang,已是五个字符了,因此回车换行并不会读入,最后fgets()添加字符串结束标志’\0’,因此咱们看到输出时,Press any…并无换行输出,而是和zhang在同一行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值