使用memcpy将一个字符串添加到另外一个字符串之前

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 
#include 

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;

你可能感兴趣的:(Linux,C语言,Nmap源码学习)