【问题标题】:C programming: Replace an inner string using strcpy?C 编程:使用 strcpy 替换内部字符串?
【发布时间】:2012-06-08 03:34:34
【问题描述】:

我已使用以下代码将 HTML 文件复制到数组中:

fseek(board, 0, SEEK_END);
long int size = ftell(board);
rewind(board);
char *sourcecode = calloc(size+1, sizeof(char));
fread(sourcecode, 1, size, board);

现在我的目标是用已经定义的字符字符串“king”替换数组中的某个注释。例如。

king

我使用以下代码:

    find_pointer = strstr(sourcecode, text2find);
    strcpy(find_pointer, king);
    printf("%s", sourcecode);

其中 text2find = "";

但是当我打印时,很明显我所有的字符都被删除了。好像它自动添加了一个终止字符。我该如何解决这个问题,以便 保持原样?

编辑::::: 我使用了 strncpy 并设置了一些字符,以便不添加终止字符。这是最好的方法吗?

【问题讨论】:

    标签: c string strcpy


    【解决方案1】:

    好吧,strcpy 添加了一个 0 终止符。因此,尽管字符串的其余部分仍然存在,但标准字符串处理函数不再看到它,因为它们在 0 终止符处停止。您可以使用空格手动覆盖它,也可以使用memcpy 而不是strcpy

    【讨论】:

    • 是的,或者那个。随你喜欢。
    • 这忽略了一个更大的问题,即除非搜索字符串和替换字符串的长度相同,否则此策略将不起作用。在这种情况下,它们不是。
    【解决方案2】:

    您基本上不能这样做,除非您要替换的东西大小完全相同。在这种情况下,您可以使用memcpystrncpy

    如果尺寸不同,您可以尝试以下方式:

    char *buffer = malloc(size); // size should be big enough to store the whole final html code
    find_pointer = strstr(sourcecode, text2find);
    len = find_pointer - sourcecode;
    memcpy (buffer, sourcecode, len);
    memcpy (buffer + len, "king", 4);
    memcpy (buffer + len + 4, find_pointer + 4, strlen(sourcecode) - len - strlen(text2find)); 
    free(sourcecode);
    sourcecode = buffer;
    

    【讨论】:

      【解决方案3】:

      首先,您应该使用strncpy(或者,如果可用,更好的是strlcpy),因为它实际上执行边界检查(即,它只复制指定的、提供的字符数)。否则,您最终可能会尝试将内存复制到目标字符串的末尾,从而导致未定义和潜在的破坏性行为。其次,即使您要使用 strncpymemcpy 之类的函数来避免复制终止的空字符,您的目标字符串也不会正确格式化,因为您尝试覆盖的字符串的长度与字符串不同您正在尝试复制的内容。

      【讨论】:

      • 正确,碰巧在html中我只是添加了几个空格以使它们的长度相同
      【解决方案4】:

      替换 C 字符串中的字符很痛苦,因为与 C++ 相比,您在非常低的级别执行操作。你真的需要为它制定一个算法!

      首先,注意原地替换并不总是可行的:如果要替换的子字符串比替换的要短,则需要分配更多内存。无论哪种方式都更容易为结果分配内存,因此您可以按照以下方式进行:

      • 查找替换后 字符串的长度。为此,您需要找到要替换的评论的开头和结尾,然后进行计算。
      • 接下来,为结果分配一块新的内存,并将源内存 memcpy 直到替换点。
      • 现在复制替换字符串,最后将源代码的结尾部分复制到结果中
      • 最后,释放源字符串的缓冲区,并返回结果。

      【讨论】:

      • 谢谢。 skyel 说了类似的话并发布了一些代码。欢呼
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多