2

我已使用以下代码将 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'替换数组中的某个注释。例如

<html代码><!comment><更多html代码>

<html代码>王<更多html代码>

我使用以下代码:

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

其中 text2find = "<!comment>";

但是,当我打印时,很明显,我在“国王”之后的所有字符都已被删除……好像它自动添加了一个终止字符。我该如何解决这个问题,以便 <更多 html 代码> 保持原位?

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

4

4 回答 4

4

你基本上不能这样做,除非你要替换的东西是完全相同的大小。在这种情况下,您可以使用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;
于 2012-06-03T23:56:22.100 回答
3

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

于 2012-06-03T23:55:10.040 回答
1

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

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

  • 查找替换字符串的长度。为此,您需要找到要替换的评论的开头和结尾,然后进行数学计算。
  • 接下来,为结果分配一块新的内存,并将源内存存储到替换点。
  • 现在复制替换字符串,最后将源代码的结尾部分复制到结果中
  • 最后,释放源字符串的缓冲区,并返回结果。
于 2012-06-04T00:07:42.577 回答
0

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

于 2012-06-04T00:00:46.277 回答