簡體   English   中英

C通過引用字符串傳遞

[英]C Pass by reference string

我想修改函數內部的字符串。 我的代碼非常簡單:

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

sprintfchar*作為其第一個參數,而不是char** ,因此它應該是sprintf(*string,"some string"); 但是*string在此時將為NULL ,因此仍然無效。

如果希望字符串的內存由doSomething函數分配,則需要在該函數中分配內存。 sprintf不會為你分配任何內存。 因此,在調用sprintf之前,您需要使用malloc分配內存,並使*string指向該內存。 您還應該知道,您的功能用戶需要在完成內存后釋放內存。

這應該工作

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

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)傳遞去引用的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM