
今天在写一段字符串提取的代码时候,出现了内存溢出,找了好久也没有找到。因为以前用strcpy因为没有数量限制,当字符串最后没有 时候,就会一直覆盖,造成内存溢出。后来改用char *strncpy(char *dest, const char *src, int n),最后一个参数是字符数,当超过这个个数的时候,会自动停止复制。
在检查了所有代码都没有问题后,觉得应该是strncpy的问题,于是我只留下strncpy,发现只要最后的一个参数大于dest的长度,就会出现内存溢出。
以前认为,dest的n长度内,只会在字符串的最后一个字符后面加一个 ,其实是加减去有效字符个数的 ,如果dest的长度不足以容纳多出去的 就会写出界。
例如:
int dest[3];
//dest只有3个字符,刚好容纳"hi"加上一个
//但是后面传入了5的参数,遇到 并不会停止,而是往dest[3],dest[4]继续写入 造成溢出。
strncpy(dest,"hi",5);
经过调试没有什么问题了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>static int strCut(char *src,char *des,char *beginStr,char *endStr)
{//复制出,第一个开始符和开始符后第一个结束符之间的字符串。int lengthTotal;int lengthBeginStr;char *begin;char *end;lengthTotal=strlen(src);lengthBeginStr=strlen(beginStr);if(lengthTotal>0){begin=strstr(src,beginStr);if(begin){if(endStr[0]==0){//空字符表示取到末尾strncpy(des,begin+lengthBeginStr,strlen(begin+lengthBeginStr)+1);return 1;}else{end=strstr(begin+lengthBeginStr,endStr);if(end){int tempLength;if(begin>end){tempLength=begin-end;}else{tempLength=end-begin;}strncpy(des,begin+lengthBeginStr,tempLength-lengthBeginStr);printf("des:%srn",des);return 1;}else{return 0;}}}else{return 0;}}return 0;
}int main()
{char *src="ifconfig eth0 192.168.1.123 up netmask 255.255.255.0";char IP[32];char netmask[32];memset(IP,0,sizeof(IP));memset(netmask,0,sizeof(netmask));strCut(src,IP,"eth0 "," up");strCut(src,netmask,"netmask ","");printf("IP:%s,netmask:%srn",IP,netmask);//IP:192.168.1.123,netmask:255.255.255.0return 0;
}
本文发布于:2024-03-11 16:30:20,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1710558530142304.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |