簡體   English   中英

為什么在我的C代碼中未更新字符串值?

[英]Why string value is not being updated in my C code?

我不明白我的代碼有什么問題。 我為字符串分配了空間,並通過引用unparse_symbol函數將其傳遞。 但是,以某種方式未將str設置為我在switch語句中證明的字符串,例如str =“ ADD”並未將str設置為“ ADD”。 我真的不明白是什么問題。分配空間並傳遞指針。

感謝幫助!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef enum {ADD, MULT, MINUS, DIV, MOD, BAD} op_type;

    void unparse_symbol(op_type op, char *str)
    {
      switch (op) {
      case ADD:
        str = "ADD";
        break;
      case MULT:
        str = "MULT";
        break;
      case MINUS:
        str = "MINUS";
        break;
      case DIV:
        str = "DIV";
        break;
      case MOD:
        str = "MOD";
        break;
      case BAD:
        str = "BAD";
        break;

      default: str = "DEFAULT_CASE";
      }
      return;
    }

int main(void){

    char *string = calloc(10, 1);
    op_type add = ADD;
    unparse_symbol(add, string);
    printf("%s \n", string);

    return 0;
}

在函數unparse_symbol參數str是該函數的局部變量。 退出函數后,該局部變量將不活動。 函數中此局部變量的更改不會影響作為參數傳遞的原始對象。

您應該像這樣聲明函數

void unparse_symbol(op_type op, char **str)

在函數中使用類似

  switch (op) {
  case ADD:
    *str = "ADD";
    break;

程序中也有內存泄漏。 要轉義它,您可以通過以下方式定義函數

void unparse_symbol(op_type op, char *str)
{
  switch (op) {
  case ADD:
    strcpy( str, "ADD" );
    break;

因此,要么刪除內存分配,然后將函數定義為

void unparse_symbol(op_type op, char **str)

在switch語句中使用指針分配

或保留相同的函數聲明,但使用函數strcpy將字符串文字復制到指針所指向的已分配內存中。

在最后一種情況下,您需要使用free函數free分配的內存

free( str );

還應考慮到,如果要使用最后一種情況,則必須更改語句

char * string = calloc(10,1);

增加了分配的內存的大小,因為在標簽default使用的字符串文字包含10個以上的字符。

default: str = "DEFAULT_CASE";

您將函數中的本地指針str指向字符串文字

str = "ADD";

這既不會復制字符串,也不會更新傳遞給函數的字符串。

您必須將字符串復制到str指向的數組

strcpy( str , "ADD" ) ;

由於您為str分配了十個字符

char *string = calloc(10, 1);

您不應復制超過9個字符+空終止符。

這是因為“ whatever”是char *類型,因此您可以在函數內部更改指針,而不是字符串本身。 建議將取決於您實際上要執行的操作:重寫字符串本身? 或將函數外部的指針更改為僅在函數內部存在的字符串? 后者當然是行不通的...

弗拉德的答案是迄今為止最好的。

請記住,有一種更好的方法可以將枚舉值(實際上是任何值)轉換為字符串。

您可以利用C預處理程序。

#define STRINGIFY(VAL) "" # VAL

const char* addStr = STRINGIFY(ADD);

它將VAL連接到一個空字符串,從而創建一個包含VAL的字符串。

嘗試這個:

void unparse_symbol(op_type op, char **str)
{
  switch (op) {
  case ADD:
    *str = "ADD";
    break;
  case MULT:
    *str = "MULT";
    break;
  case MINUS:
    *str = "MINUS";
    break;
  case DIV:
    *str = "DIV";
    break;
  case MOD:
    *str = "MOD";
    break;
  case BAD:
    *str = "BAD";
    break;

  default: *str = "DEFAULT_CASE";
  }
  return;
}

int main(void){

char *string = calloc(10, 1);
op_type add = ADD;
unparse_symbol(add, &string);
printf("%s \n", string);

return 0;
}

我希望你能得到答案。 您應該找出原因。

暫無
暫無

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

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