c-用另一个字符串的部分覆盖字符串的部分



我试图用另一个字符串的一部分覆盖一个字符串中的一部分。

基本上,我想访问字符串的给定索引,从另一个字符串的另一个给定索引中写入给定数量的字符。

所以像memcpy(stringa[indexa], stringb[indexb], length);这样的函数,只是它不起作用。

使用strncpy也就足够了。

根据要求提供更多代码:

void mymemset(char* memloc, char* cmd, int data_blocks[], int len)
{
    int i = 0;
    while(i < len)
    {
        //missing part. Where I want the "memcpy" operation to take place
        i++;
    }
    return;
}

memloc是我们要重写的字符串,cmd是我们要从中重写的字符串。data_blocks包含关于我们应该在memloc中写入的位置的信息,len是我们正在执行的操作数。所以我想在位置data_blocks[i]重写,每次从cmd重写8个字符。

编辑:我想我只是忘了一个&,很抱歉把你弄糊涂了,谢谢你抽出时间。这似乎奏效了:

void mymemset(char* memloc, char* cmd, int data_blocks[], int len)
{
    int i = 0;
    while(i < len)
    {
        memcpy(&memloc[data_blocks[i]], &cmd[i*8], 8);
        i++;
    }
    return;
}

cmd每次取8个字节,将它们存储在memloc中由data_blocks[i]给出的索引处。如前所述,data_blocks包含关于memloc中可用的不同索引的信息,并且可以对字符串cmd进行分段。

假设stringastringb声明如下

char stringa[] = "Hello" ;
char stringb[] = "World" ;

这应该有效:

memcpy(&stringa[1], &stringb[1], 2) ;

您的示例不应该编译,或者如果它编译了,则可能会崩溃或导致未定义的行为:

memcpy(stringa[1], stringb[1], 2) ;

您的命名令人困惑:memset使用字节。若您操作字符串,您需要采取额外的预防措施:想想

我想你想要这样的东西:

void my_str_overwrite(char* dest, const char* ref, int idx, size_t count)
{
    size_t input_len = strlen(dest);
    if(input_len <= idx+count)
    {
        // Error: not enough space
    }
    for(size_t i=0; i<count; i++)
    {
        dest[idx+i] = ref[i];
    }
    return;
}
  • 您不需要传递整个data_block[]数组,如果我理解正确的话,您只对这个数组中的一个元素感兴趣,该元素包含副本的偏移量
  • 由于您没有修改cmd,因此它应该是const
  • 上面的代码不处理NULL终止字节,如果它实际上是字符串,则应该将其附加到memloc

因此,我想在位置data_blocks[I]覆盖,每次从cmd8个字符

这个让人困惑。如果您知道每次调用函数时只需要复制8个字节,那么在上面的代码中,将count作为函数中的局部变量,并将其修复为size_t count = 8;

如果字符串大小相同,则可以使用memcpy:

#include <strings.h>
char text[] = "Hello James!";
char name[] = "Jenny";
char* pos = strstr(text, "James");
memcpy(pos, name, strlen(name)-1); // for the ''

如果不是,那么你必须重新分配字符串,因为长度会改变

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define STR "Hello James!"
void replace(char** src, char* find, char* rep) {
    char* ret = NULL;
    char* pos = strstr(*src, find);
    if (!pos)
        return; // no changes
    int l = (1 + strlen(*src) + strlen(rep) - strlen(find));
    ret = (char*)malloc(sizeof(char) * l);
    ret[l-1] = 0;
    int ind = (int)(pos - *src);
    strncpy(ret, *src, ind);
    printf("ind: %d; %sn", ind, ret);
    strncpy(&ret[ind], rep, strlen(rep));
    strncpy(&ret[ind+strlen(rep)], &pos[strlen(find)], strlen(pos)-strlen(find));
    printf("%sn", ret);
    free(*src);
    *src = ret;
}
int main() {
    char *str = NULL;
    str = (char*)malloc(sizeof(char) * (strlen(STR)+1));
    assert(str);
    strcpy(str, STR);
    printf("before: %sn", str);
    replace(&str, "James", "John");
    printf("after: %sn", str);
    free(str);
    return 0;
}

此代码未优化。

相关内容

  • 没有找到相关文章

最新更新