gpt4 book ai didi

c - 在C中将字符串插入另一个字符串

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:25 26 4
gpt4 key购买 nike

我正在实现一个函数,给定一个字符串、一个字符和另一个字符串(因为现在我们可以称它为“子字符串”);将子字符串放在字符串中字符所在的任何位置。为了更好地解释我,给定这些参数,这是函数应该返回的内容(伪代码):

func ("aeiou", 'i', "hello")  ->  aehelloou

我正在使用 string.h 库中的一些函数。我已经对其进行了测试,结果非常好:

char *somestring= "this$ is a tes$t wawawa$wa";
printf("%s", strcinsert(somestring, '$', "WHAT?!") );

Outputs: thisWHAT?! is a tesWHAT?!t wawawaWHAT?!wa

所以现在一切都还好。问题是当我尝试对例如这个字符串做同样的事情时:

char *somestring= "this \"is a test\" wawawawa";
printf("%s", strcinsert(somestring, '"', "\\\"") );

因为我想将每个 " 更改为 \" 。当我这样做时,PC 崩溃了。我不知道为什么,但它停止工作然后关机。我已经了解了一些关于 string.h lib 的一些函数的不良行为,但我找不到任何关于这方面的信息,我真的很感谢任何帮助。

我的代码:

#define salloc(size) (str)malloc(size+1) //i'm lazy
typedef char* str;

str strcinsert (str string, char flag, str substring)
{
int nflag= 0; //this is the number of times the character appears
for (int i= 0; i<strlen(string); i++)
if (string[i]==flag)
nflag++;
str new=string;
int pos;
while (strchr(string, flag)) //since when its not found returns NULL
{
new= salloc(strlen(string)+nflag*strlen(substring)-nflag);
pos= strlen(string)-strlen(strchr(string, flag));
strncpy(new, string, pos);
strcat(new, substring);
strcat(new, string+pos+1);
string= new;
}
return new;
}

感谢您的帮助!

最佳答案

一些建议:

  • 避免typedef char* str;char * 类型在 C 中很常见,屏蔽它只会让您的代码更难被审查
  • 出于完全相同的原因,避免#define salloc(size) (str)malloc(size+1)。此外,不要在 C 中强制转换 malloc
  • 每次你写一个malloc(或callocrealloc)应该有一个相应的free: C没有垃圾回收
  • 动态分配很昂贵,只在需要时使用它。换句话说,循环内的 malloc 应该被看两次(特别是如果没有相应的 free)
  • 始终测试分配函数(与 io 无关)当您耗尽内存时,malloc 将简单地返回 NULL。一条漂亮的错误消息比崩溃更容易理解
  • 学习使用调试器:如果您在调试器下执行代码,错误就会很明显

下一个原因:如果替换字符串包含原始字符串,您将再次落在它上面并陷入无限循环

一种可能的解决方法:在循环之前分配结果字符串,并在原始字符串和结果中推进。它将避免不必要的分配和取消分配,并且不受替换字符串中出现的原始字符的影响。

可能的代码:

// the result is an allocated string that must be freed by caller
str strcinsert(str string, char flag, str substring)
{
int nflag = 0; //this is the number of times the character appears
for (int i = 0; i<strlen(string); i++)
if (string[i] == flag)
nflag++;
str new_ = string;
int pos;
new_ = salloc(strlen(string) + nflag*strlen(substring) - nflag);
// should test new_ != NULL
char * cur = new_;
char *old = string;
while (NULL != (string = strchr(string, flag))) //since when its not found returns NULL
{
pos = string - old;
strncpy(cur, old, pos);
cur[pos] = '\0'; // strncpy does not null terminate the dest. string
strcat(cur, substring);
strcat(cur, string + 1);
cur += strlen(substring) + pos; // advance the result
old = ++string; // and the input string
}
return new_;
}

注意:我没有还原 strsalloc 但你确实应该还原。

关于c - 在C中将字符串插入另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46958109/

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