【问题标题】:C Pass by reference stringC 通过引用字符串传递
【发布时间】:2014-08-11 13:47:15
【问题描述】:

我想修改函数内部的一个字符串。我的代码很简单:

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

【问题讨论】:

  • 您应该使用警告标志进行编译
  • sprintf 不为字符串分配内存。您需要在main() 中声明一个字符数组或使用asprintf

标签: c function reference char c-strings


【解决方案1】:

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 的地址传递给它(即 &origString )。您只需要通过 doSomething ( origString ) 将取消引用的指针传递给它。

【讨论】:

  • 如果你要否决我的回答,你至少应该提到代码不起作用(它确实起作用)或者我的解释有误,然后更正它。
【解决方案2】:

这应该可以工作

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

【讨论】:

  • @user1042850 - 见上文 - 请表达你的感激之情
  • @user1042850 - 请整理一下缩进
  • 我听不懂你什么意思?
  • @user1042850 - 排列整齐 - 更易于阅读。通常会这样做。
【解决方案3】:

sprintfchar* 作为它的第一个参数,而不是char**,所以它应该是sprintf(*string,"some string");。然而,*string 届时将是NULL,所以这仍然行不通。

如果您希望doSomething 函数为您的字符串分配内存,您将需要在该函数中分配内存。 sprintf 不会为您分配任何内存。因此,在调用sprintf 之前,您需要使用malloc 分配内存并使*string 指向该内存。您还应该知道,您的函数的用户在完成后需要释放内存。

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2016-07-05
    • 2018-09-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-04-09
    • 2015-04-08
    相关资源
    最近更新 更多