nmap中字符串添加的功能函数
/* Prepend an n-char string to a filespace */ int fs_prepend(char *str, int len, struct filespace *fs){ char *tmpstr; if (len < 0) return -1; if (len == 0) return 0; if (fs->current_alloc - fs->current_size < len + 2) {//这里判断是否有足够空间放str fs->current_alloc = (int)(fs->current_alloc * 1.4 + 1);//不明白为什么×1.4 fs->current_alloc += 100 + len; tmpstr = (char *)safe_malloc(fs->current_alloc); memcpy(tmpstr, fs->str, fs->current_size);//将原有的字符串复制到新开辟的内存中 fs->pos = (fs->pos - fs->str) + tmpstr;//修改pos的位置,假如pos和str在同一个位置上,就是把tmpstr赋值给了pos,如果不在一个位置上,就不懂了 if (fs->str) free(fs->str); fs->str = tmpstr; } if (fs->current_size > 0) memmove(fs->str + len, fs->str, fs->current_size);//后移len memcpy(fs->str, str, len); fs->current_size += len; fs->str[fs->current_size] = '\0'; return 0; }
filespace结构:
struct filespace { int current_size; int current_alloc; /* Current position in the filespace */ char *pos; char *str; };
写一个字符串添加到另一个字符串前面的例子。
#include <stdio.h> #include <string.h> void prepend(char *str,int len,char *pos) { int current_alloc = 1024; int current_size; char *tmpstr; current_size= strlen(pos); tmpstr = (char *)malloc(current_alloc); memcpy(tmpstr,pos,current_size); pos = tmpstr; //上面一小段只是仿照上面程序,貌似可以没有 memmove(pos+len,pos,current_size); //把原有字符串后移len个长度 memcpy(pos,str,len); //把新字符串添加到头部 current_size+=len; //字符串长度增加 pos[current_size]='\0'; printf("current_size=%d,len=%d str=%s, pos=%s\n",current_size,len, str, pos); } int main(int argc, char *argv[]) { char *pos = "123456"; char *str = "abcd"; int len = strlen(str);//用strlen可以自动剔除'\0'避免复制之后,字符串显示不全 prepend(str,len,pos); printf("str=%s pos=%s \n",str, pos); }
程序的输出:
current_size=10,len=4 str=abcd, pos=abcd123456
str=abcd pos=123456
参数没有传进去的样子,之后再解决。
假如要将一个字符串添加到另一个之后
memcpy(pos+current_size,str,len); current_size+=len;