我正在尝试编写一个函数,允许我在字符串“src”中找到子元素“from”,并在所有情况下用“to”子字符串替换“from”子字符串,并输出新字符串通过“dest”;但是我认为我的代码看起来有点不确定,而且我不理解(概念上)如何返回带有dest的输出,因为输出的类型为void。我想知道是否有人可以提供一些帮助?
例如:
find_replace("pooppoop poop", "poo", "hel", dest) should return
"helphelp help"
谢谢你!
void find_replace(char* src, char* from, char* to, char* dest)
{
dest = (char * ) malloc(sizeof(src)+sizeof(from));
int i;
int j;
int check = 1;
for (i = 0; i <= strlen(src) - 1; i++) {
if (src[i] == from[0]) {
for (j = 0; j <= strlen(from) - 1; i++) {
if (src[i+j] != from[j]) {
check = 0;}
else {
continue;
}}}
if (check == 1) {
char * str3 = (char *) malloc(1 + strlen(&src[i]) + strlen(to));
strcpy(str3, &src[i]);
strcat(str3, to);
}
else { continue; }
}
return ;
答案 0 :(得分:1)
在示例中为新字符串分配内存,但调用代码无法访问此变量。
基本上,传递字符串有三种方法。每个都有优点和缺点。
传递固定大小的缓冲区
int repl1(char *dest, int n, const char *src, const char *find, const char *repl)
这里,调用函数提供了一个函数可以写入的缓冲区。提供最大缓冲区长度是个好主意,这样函数就不会溢出缓冲区。参数,其中您不打算更改的内容应为const
,即指向不可修改数据的指针。
这样的函数可以是void
,但它也可以返回一个整数,表示dest
中字符串的长度。
优点是您可以轻松传递自动缓冲区。缺点是这些缓冲区可能太小而无法完成任务。
像这样调用函数:
char buf[80];
int n = repl1(buf, sizeof(buf), str, "this", "that");
返回已分配的内存
char *repl2(const char *src, const char *find, const char *repl)
这里,函数应该分配新的内存来保存缓冲区。该函数返回指向新内存的指针。该内存“属于”调用函数,后者负责释放内存。
优点是该函数可以为任务分配足够的内存。缺点是调用函数必须负责管理新内存。
像这样调用函数:
char *dest = repl2(str, "this", "that");
// Do stuff whith 'dest' ...
free(dest);
将指针指向精简版
int repl3(char **dest, const char *src, const char *find, const char *repl)
这是返回指针的变体,指针通过引用传递,因此可以更改。该函数还可以访问dest
char缓冲区的旧内容。这对你的情况没用。我只提到了这种完整性的可能性。
像这样调用函数:
char *buf;
int n = repl3(&buf, str, "this", "that");
这个答案解决了传递数据的方式。您的代码使用第二种方法,因此您应该返回dest
,但不要将其作为参数传递。我没有看过你的功能逻辑。
答案 1 :(得分:0)
Void类型方法不会返回任何内容,您可以做的是将函数类型更改为字符串并返回字符串。
答案 2 :(得分:0)
[除了分析你的函数的逻辑]一个返回类型void
的函数赢了[并且可以&#39; 使用{返回任何值{1}}陈述。另外,值得一提的是,您不能使用return
语句返回多个值 [根据需要]。
要获得 return 值,您应该调用函数并将指针传递给return
作为参数。然后,在你的函数内部,当你赋值/改变这些指针指向的位置的值时,它们将被修改,并且在从函数返回后,在调用函数中,你将拥有修改后的价值。
这是从被调用函数一次获得多个 return 值的另一种方法。
答案 3 :(得分:0)
Void表示无效,因此您无法返回具有void函数的值。 如果你想使用void函数,我假设你想使用call-by-reference而不是call-by-value。 这意味着,您指定了该函数的指针,以告知您的数组所在的位置。然后你就可以使用真实的&#39;数组,而不是副本。
答案 4 :(得分:0)
printf("%s\n",find_replace("pooppoop poop", "poo", "hel", dest));
char * find_replace(char* src, char* from, char* to, char* dest)
{
dest = (char * ) malloc(sizeof(src)+sizeof(from));
int i;
int j;
int check = 1;
for (i = 0; i <= strlen(src) - 1; i++) {
if (src[i] == from[0]) {
for (j = 0; j <= strlen(from) - 1; i++) {
if (src[i+j] != from[j]) {
check = 0;}
else {
continue;
}}}
if (check == 1) {
char * str3 = (char *) malloc(1 + strlen(&src[i]) + strlen(to));
strcpy(str3, &src[i]);
strcat(str3, to);
return str3 ;
}
else { continue; }
}
return "";
}
答案 5 :(得分:0)
该行:
dest = (char * ) malloc(sizeof(src)+sizeof(from));
覆盖
中传递的地址void find_replace(char* src, char* from, char* to, char* dest)
如果你想在内部分配内存(我认为你必须这样做,因为调用者不能知道保留多少),你必须告诉结果数据最终的调用者。要么选择out-parameter:
void find_replace(char* src, char* from, char* to, char** dest)
{
*dest = malloc(...);
或,我希望你返回指针:
char* find_replace(char* src, char* from, char* to)
{
char* dest = malloc(...);
// ...
return dest;
}