gpt4 book ai didi

c - 如何替换字符串中的子字符串?

转载 作者:行者123 更新时间:2023-12-02 19:17:42 25 4
gpt4 key购买 nike

我有一个字符串,我需要在其中找到一个子字符串并替换它。要找到的和将替换它的长度不同。我的部分代码:

char *source_str = "aaa bbb CcCc dddd kkkk xxx yyyy";
char *pattern = "cccc";
char *new_sub_s = "mmmmm4343afdsafd";

char *sub_s1 = strcasestr(source_str, pattern);

printf("sub_s1: %s\r\n", sub_s1);
printf("sub_str before pattern: %s\r\n", sub_s1 - source_str); // Memory corruption

char *new_str = (char *)malloc(strlen(source_str) - strlen(pattern) + strlen(new_sub_s) + 1);

strcat(new_str, '\0');
strcat(new_str, "??? part before pattern ???");
strcat(new_str, new_sub_s);
strcat(new_str, "??? part after pattern ???");
  1. 为什么我会出现内存损坏?

  2. 如何有效提取 pattern 并将其替换为 new_sub_s

最佳答案

您的代码中存在多个问题:

  • 您不会测试是否在字符串中找到 sub_s1。如果没有匹配怎么办?
  • printf("sub_str before pattern: %s\r\n", sub_s1 - source_str); 为需要字符串的 %s 传递指针差异。该行为未定义。
  • strcat(new_str, '\0'); 具有未定义的行为,因为目标字符串未初始化,并且您传递了一个空指针作为要连接的字符串。 strcat 需要一个字符串指针作为其第二个参数,而不是 char,并且 '\0' 是一个 int 类型的字符常量(在 C 语言中)和值 0,编译器会将其转换为空指针,无论有或没有警告。您可能想写 *new_str = '\0';

您无法使用发布的 strcat 组成新字符串:因为匹配之前的字符串不是 C 字符串,而是 C 字符串的片段。您应该确定源字符串不同部分的长度,并使用 memcpy 复制具有显式长度的片段。

这是一个例子:

char *patch_string(const char *source_str, const char *pattern, const char *replacement) {
char *match = strcasestr(source_str, pattern);
if (match != NULL) {
size_t len = strlen(source_str);
size_t n1 = match - source_str; // # bytes before the match
size_t n2 = strlen(pattern); // # bytes in the pattern string
size_t n3 = strlen(replacement); // # bytes in the replacement string
size_t n4 = len - n1 - n2; // # bytes after the pattern in the source string
char *result = malloc(n1 + n3 + n4 + 1);
if (result != NULL) {
// copy the initial portion
memcpy(result, source_str, n1);
// copy the replacement string
memcpy(result + n1, replacement, n3);
// copy the trailing bytes, including the null terminator
memcpy(result + n1 + n3, match + n2, n4 + 1);
}
return result;
} else {
return strdup(source_str); // always return an allocated string
}
}

请注意,上面的代码假设源字符串中的匹配项与模式字符串的长度相同(在示例中,字符串 "cccc""CcCc" 具有相同的长度)。鉴于 strcasestr 预计将执行与大小写无关的搜索,这已通过问题中的示例字符串得到证实,因此该假设可能会失败,例如,如果大小写字母的编码具有不同的长度,或者如果重音符号与 strcasestr 匹配(如法语中所期望的那样):"é""E" 应该匹配,但是以 UTF-8 编码时具有不同的长度。如果 strcasestr 具有此高级行为,则无需更复杂的 API 就无法确定源字符串的匹配部分的长度。

关于c - 如何替换字符串中的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63471522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com