C通过引用字符串传递

时间:2014-06-20 18:21:58

标签: c function reference char c-strings

我想修改函数内部的字符串。我的代码非常简单:

#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;
}

3 个答案:

答案 0 :(得分:2)

sprintfchar*作为其第一个参数,而不是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)将它取消引用指针。