收录日期:2021/01/26 17:02:58 时间:2016/07/12 06:44:43 标签:C语言
请问:gets(),strcmp(),strcpy(),...这些函数都可能引起缓冲区溢出,在实际应用中怎么处理呢?
比如下面这段程序:
void main()
{
    char str1[5],str2[10];
    gets(str1);//在用户输入字符大于5个的时候如何保护呢
     gets(str2);
     strcpy(str1,str2);//这种情况如何保护呢
}
使用string
使用c++标准库中的流
C语言提供灵活性的时候,也存在了一些不容易把握的地方.

你可以开大点的缓冲区.

可以逐个读字符.

或者其它的一些办法
引用楼主 erqi_chen 的帖子:
请问:gets(),strcmp(),strcpy(),...这些函数都可能引起缓冲区溢出,在实际应用中怎么处理呢? 
比如下面这段程序: 
void main() 

    char str1[5],str2[10]; 
    gets(str1);//在用户输入字符大于5个的时候如何保护呢 
    gets(str2); 
    strcpy(str1,str2);//这种情况如何保护呢 
}

做strcpy(str1,str2); 之前 先做个if(strlen(str1)>strlen(str2)) 先判断确定下是否有足够大的空间
    gets(str1); 这个地方只能设置大的空间了 

MSDN 建议使用fgets代替gets 来达到控制长度防止溢出的效果
char *fgets( 
   char *string,
   int n,
   FILE *stream 
);

类似的strcpy 可以用可指定长度的strncpy代替
char *strncpy(
   char *strDest,
   const char *strSource,
   size_t count 
);

4楼! 4楼!
1.使用C++标准库的string
2.strcpy这个函数有安全版本的嘛
C语言的设计本身就是让程序员自己来管理自己的内存的.你不管理谁管理呀.
C++倒是有一个库帮那些想省事的程序员管理了内存,你倒可以试试.并且即使是
C++,也基本是靠程序员自己管理自己的内存.除非使用更高级的语言.
strcpy_s
#include <stdio.h>
#include <string.h>
int strcmp1(char *str1,char *str2)
{
while((*str1==*str2)&&*str1)
{
*str1++;
*str2++;
}
return *str1-*str2;
}

void main()
{
char str1[5],str2[5];
char *p1 = str1,*p2 = str2;
int resu;
printf("Please input 2 strings you want to compare:\n");
fgets(str1,5,stdin);
fgets(str2,5,stdin);
resu = strcmp1(p1,p2);
printf("Compare result is :%d\n",resu);
}

这个程序我发现输入一个字符串,回车之后,就返回结果了,我是想输入一个字符串,按回车再输入一个的,这是什么问题呢?
fgets(str1,5,stdin); 
fflush(stdin);
fgets(str2,5,stdin); 
是因为输入的字符串大于5个了,
但是这样我输入一个大于5个字符的字符串就当成两个字符串分别读到str1和str2里,计算返回结果,
可以起到缓冲安全的作用,但是程序的功能不是我想要的。我是想比较输入的两个字符串,怎么解决呢?
引用 9 楼 erqi_chen 的回复:
#include <stdio.h> 
#include <string.h> 
int strcmp1(char *str1,char *str2) 

while((*str1==*str2)&&*str1) 

*str1++; 
*str2++; 

return *str1-*str2; 


void main() 

char str1[5],str2[5]; 
char *p1 = str1,*p2 = str2; 
int resu; 
printf("Please input 2 strings you want to compare:\n"); 
fgets(str1,5,stdin); 
fgets(str2,5,stdin); 
resu = strcmp1(p1,p2); 
printf("Com…

char str1[5],str2[5];LZ你设置的数组 太小了 是不是输入超过4个字符 就直接返回了 
#include <stdio.h>
  char *fgets( char *str, int num, FILE *stream );
函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以null结束.fgets()成功时返回str(字符串),失败时返回NULL. 


看看函数用法
引用 11 楼 erqi_chen 的回复:
是因为输入的字符串大于5个了, 
但是这样我输入一个大于5个字符的字符串就当成两个字符串分别读到str1和str2里,计算返回结果, 
可以起到缓冲安全的作用,但是程序的功能不是我想要的。我是想比较输入的两个字符串,怎么解决呢?

在字符串传入函数的时候做判断啊 这样确保调用函数不会有问题
存在问题的库函数都有替代的安全函数,建议使用新的安全的函数。
fgets(),strncpy()…………
引用楼主 erqi_chen 的帖子:
请问:gets(),strcmp(),strcpy(),...这些函数都可能引起缓冲区溢出,在实际应用中怎么处理呢? 
比如下面这段程序: 
void main() 

    char str1[5],str2[10]; 
    gets(str1);//在用户输入字符大于5个的时候如何保护呢 
    gets(str2); 
    strcpy(str1,str2);//这种情况如何保护呢 
}

输入时将gets(str1)替换成fgets(str1,5,stdin);
strcpy(str1,str2);替换成strncpy(str1,str2,5);
明白了,谢谢各位!

菜鸟问题(分不多)! 为什么我的log4j不能用 关于ADO.NET设计模型上的困惑? 客户端建立odbc数据源时出现“超时已过期”,安装mdac2.7仍未解决问题? 问一个owc控件问题(Spreadsheet) 请问如何能让EXECL中的表格框线变细啊。就像WPS中的一样。 中国10大谎言 用代码建立表并添加到Access数据库中 超智力问题!(悬赏求解) 使用OE进程的JS.fortnight病毒怎么清除不干净? 小弟的个人主页刚做完,大家去提提意见吧!来人有分! 小弟的个人主页刚做完,大家去提提意见吧!来人有分! 如何编程实现鼠标单击双击? 吃饭灌水! 做VB开发的,有出路吗? [求助]ftp的端口问题! 交友不慎,救命啊!散分求助 C++面向对象多线程 这本书如何? 这样一个想法看可不可性, win xp 家庭版 能加入到 windows 域中么? 您好,能否提供SolPart Menu 动态菜单代码C#代码 一台机器上能否装两个domino 服务?急,求教各位大虾! oracle建库问题,请教高手! C++面向对象多线程 这本书如何? SQL查询 Group by 如何加上另一列的字段(不是分组的字段,也不是聚集函数) 喜欢反恐精英的朋友进来了,有问题向大家请教 如何给类型重命名 如typedef int DataType BDE在哪呀! 如何获取本机的IP地址? 请教模式识别的算法,高分送~