我想修改函数内部的字符串。我的代码非常简单:
#include <stdio.h>
void doSomething ( char **string )
{
sprintf(string,"some string");
}
int main ( void )
{
char *origString = NULL;
doSomething ( &origString );
printf ( "%s\n", origString );
return 0;
}
但是这段代码不起作用。我非常感谢解释而不是解决方案,但也欢迎解决方案。
我真的需要使用sprintf函数,因为想法是用%s添加一些其他字符串。
谢谢!
解决!
#include <stdio.h>
void doSomething ( char **string )
{
*string = malloc(strlen("some string") + 1);
sprintf(*string,"some string");
}
int main ( void )
{
char *origString = NULL;
doSomething ( &origString );
printf ( "%s\n", origString );
free(origString); // Previously malloced in doSomething
return 0;
}
答案 0 :(得分:2)
sprintf
将char*
作为其第一个参数,而不是char**
,因此它应为sprintf(*string,"some string");
。但是,此时*string
将为NULL
,因此仍无效。
如果希望字符串的内存由doSomething
函数分配,则需要在该函数中分配内存。 sprintf
不会为您分配任何内存。因此,在调用sprintf
之前,您需要使用malloc
分配内存,并使*string
指向该内存。您还应该知道,您的功能用户需要在完成内存后释放内存。
答案 1 :(得分:1)
这应该有效
#include <stdio.h>
void doSomething ( char *string )
{
sprintf(string,"some string");
}
int main ( void )
{
char origString[200];
doSomething ( origString );
printf ( "%s\n", origString );
return 0;
}
这会传入一个指向字符串中第一个字符的指针(200个字符的数组)。然后可以修改此数组的内容。
修改的
使用malloc
#include <stdio.h>
void doSomething ( char **string )
{
const char * const x = "Some string ksdskjkj";
*string = malloc(strlen(x) + 1 /* For the null characcter */); // Now origString will also point to this dynamic memory
sprintf(*string,"some string");
}
int main ( void )
{
char *origString = NULL;
doSomething ( &origString );
printf ( "%s\n", origString );
free(origString); // Previously malloced in doSomething
return 0;
}
答案 2 :(得分:0)
Ed Heal的解决方案是正确的,但为了使其与您最初的方式保持一致,您可以使用此方法获得相同的结果(尽管根据您的编译器设置会有一些警告):
#include <stdio.h>
void doSomething ( char **string )
{
sprintf(string,"some string");
}
int main ( void )
{
char * origString[200];
doSomething ( origString );
printf ( "%s\n", origString );
return 0;
}
在C字符串中字面上是字符数组。您试图将空指针传递给doSomething()。 doSomething(char ** string)将一个地址带到一个char指针,这样你就不需要传递origString的地址(即&amp; origString)。您所需要的只是通过doSomething(origString)将它取消引用指针。