字符串的输入

本文探讨了C语言中使用`scanf`和`gets`函数进行字符串输入时可能遇到的安全问题,如缓冲区溢出。推荐使用`fgets`和`gets_s`作为更安全的替代方案。`fgets`允许指定读取的最大字符数,而`gets_s`会检查缓冲区大小并处理过长的输入,从而减少潜在风险。文章强调了在编程中考虑安全性的重要性,并鼓励开发者采用更安全的函数来处理字符串输入。
摘要由CSDN通过智能技术生成

字符串输入

1.分配空间

假如你身边出现了这样的情况

char *name;
scanf("%s",name);

这样的代码可能会通过编译,但是在读入name的时候,name可能会擦写掉程序中的数据,这是因为该参数是一个未初始化的指针,name可能会指向任何地方。

大多数程序员都会认为出现这种情况很搞笑,但这仅限于评价别人的程序时。

最简单的方法是,在声明的时候指明数组的大小

char name[81];

2.可怜的gets()函数

说起读取字符串,很多人都会想到scanf("%s",&sssss);但是%s仅仅能读取一个单词。当面临一整句的输入时,这样的方法显然是不可行的.

gets()函数就用于处理这种情况。gets()函数简单易用,他读取整行输入,直到遇到换行符,但后丢弃换行符,存储其余字符,并在这些字符的末尾添加一个空字符让它成为一个C字符串。通常和puts()函数配对使用。

#include "stdio.h"
int main(){
   char words[100];
   puts("enter a string, please");
   gets(words);    //典型用法
   printf("your string twice:\n");
   printf("%s\n",words);
   puts(words);
   
   return 0;
}

输出结果如下

这是一个无情的结果gets()函数存在的问题:

如果上述words数组的大小不是100,而是5怎么办,由于gets()函数唯一的参数时words,他无法检查数组是否装的下输入行。如果输入的字符串过长会导致缓冲区溢出。

因此C编程社区的许多人都在建议在编程时摒弃gets()。制定C99标准的委员会也把这些建议放入了标准,承认了gets()的问题并建议不要用他。但是我认为,只要使用得当,尽量避免这些溢出问题,它的确是一个很方便的函数,你觉得呢?

3.gets()的替代品

①fgets()!!!

简单介绍一下fgets()函数与gets()函数的区别;

  • fgets()函数的第二个参数指明了读入字符的最大数量。
  • 如果fgets()读到一个换行符,会把它储存在字符串中。
  • fgets()函数的第三个参数指明要读入的文件,值得注意的是,如果读入从键盘输入的数据,则以stdin(标准输入)作为参数,该标识定义在stdio.h中
#include "stdio.h"

int main(){
	char words[50];
	puts("enter a string, please");
	fgets(words,50,stdin);
	puts(words);
	
	return 520;
}

输出结果如下:
在这里插入图片描述fputs()的应用

#include "stdio.h"

int main(){
	char words[10];
	puts("enter a string, please");
	while(fgets(words,10,stdin)!=NULL && words[0] !='\n')
          fputs(words,stdout);
	
	puts("done");
	
	return 520;
}

另外插入一个小的概念,供大家体会空字符和空指针的区别

在这里插入图片描述
②gets_s()函数!!!!

gets_s()函数与fgets()的区别如下

  • gets_s()只从标准输入中读取数据,所以不需要第三个参数
  • 如果gets_s()读到换行符,会丢弃它而不是存储它.
  • 如果gets_s()函数读到最大字符数都没有读到换行符,会执行以下几步。
    1)首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或者文件结尾,然后返回空指针。
    2)调用依赖实现的“处理函数”,可能会终止或退出程序。

到这里,大家有没有对字符串的输入有一个清晰的认识呢,也欢迎大家前来补充!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值