gpt4 book ai didi

c - 有什么方法可以改进这个函数,用 malloc 分配的字符串中的另一个字符串替换子字符串的出现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:00 25 4
gpt4 key购买 nike

我是 C 的新手,我决定创建一个名为 str_replace 的函数,该函数替换使用 malloc 生成的字符串中的字符串。它似乎有效,但任何人都可以找到任何改进的余地。

任何建议将不胜感激。我想知道人们是否认为找到出现次数来计算新的字符串大小是个好主意,我对指针的使用是否有意义。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * str_replace(char * string,char * find,char * replace){
//Replaces each occurence of a particular string inside a malloc-made string with another string
char * pos = string;
size_t replace_size = strlen(replace);
size_t find_size = strlen(find);
size_t excess = replace_size - find_size;
//Get number of occurences
int x = 0;
while (1) {
pos = strstr(pos,find);
if (pos == NULL){
break;
}
pos++;
x++;
}
if (!x){ //No occurences so return with original string
return string;
}
char * new_string = malloc(sizeof(char)*(strlen(string) + excess*x + 1)); //Plus 1 for null termination
pos = string; //Reset pointer
char * string_track = string; //Used to move around string.
char * new_string_begin = new_string; //Begining of new string to return
while (1) {
pos = strstr(pos,find);
if (pos == NULL){
strcpy(new_string,string_track); //Fill in remainder
break;
}
pos++;
size_t seg_len = pos-string_track; //Length between found string and last
strncpy(new_string,string_track,seg_len); //Copy string to just before pos
new_string += seg_len - 1; //Go to point for replacement by adding what was added to pointer.
strncpy(new_string,replace,replace_size);
new_string += replace_size; //Go to point after what was replaced
string_track = pos + find_size - 1; //Original string should go to point after found string.
}
free(string); //Remove old string
return new_string_begin; //return new string
}

int main (int argc, const char * argv[]) {
char * string = malloc(sizeof(char)*21);
strcpy(string,"No,yes,no,yes,no,yes");
printf("%s\n",string);
string = strreplace(string, "no", "nope");
printf("%s\n",string);
free(string);
string = malloc(sizeof(char)*21);
strcpy(string,"No,yes,no,yes,no,yes");
printf("%s\n",string);
string = strreplace(string, "hello", "nope");
printf("%s\n",string);
free(string);
string = malloc(sizeof(char)*21);
strcpy(string,"No,yes,no,yes,no,yes");
printf("%s\n",string);
string = strreplace(string, "yes", "y");
printf("%s\n",string);
free(string);
return 0;
}

最佳答案

总的来说,这是非常可靠的,我建议的一些事情是

1) 不要将第一个参数命名为“string”..我认为这有点冒险(string.h 没有定义“string”符号吗?)

2) 我不会释放 str_replace 函数中的旧字符串,它不是由该函数分配的,所以它不应该释放它 IMO,对于这个例子来说并不重要,但它通常是一个好习惯。这也意味着不需要“string_track”变量,因为第一个 arg 只是指向字符串的指针的副本,你可以随意使用它,而不关心它最终在哪里,因为它在函数执行时被丢弃退出。

关于c - 有什么方法可以改进这个函数,用 malloc 分配的字符串中的另一个字符串替换子字符串的出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689235/

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