2017-03-16 41 views
-2

我正在嘗試處理C語言中的結構。這是我的代碼:無法將數據添加到結構中

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

typedef struct _list 
{ 
    char *string; 
    struct _list *next; 
}LIST_T; 

LIST_T* structHead; 
LIST_T* structTail; 
LIST_T* typedefHead; 
LIST_T* typedefTail; 
LIST_T* structList; 
LIST_T* typedefList; 

void typedefAndStructHandle(int choice,char* data); 
void mystrdup(char* newString,char* originalString); 

void typedefAndStructHandle(int choice,char* data) 
    { 
    if(choice==1) 
    { 
     structList=(LIST_T*) calloc(1,sizeof(LIST_T)); 
     if(structList==NULL) 
     { 
      printf("Error the program will terminate\n"); 
     } 
     else 
     { 
      mystrdup(structList->string,data); 
      printf("structList->string: %s\n",structList->string); 
      if(structHead==NULL) 
      { 
       structHead=structList; 
      } 
      else 
      { 
       structTail->next=structList; 
      } 
      structTail=structList; 
     } 
    } 
    else if(choice==2) 
    { 
     typedefList=(LIST_T*) calloc(1,sizeof(LIST_T)); 
     mystrdup(typedefList->string,data); 

     if(typedefHead==NULL) 
     { 
      typedefHead=typedefList; 
     } 
     else 
     { 
      typedefTail->next=typedefList; 
     } 
     typedefTail=typedefList; 
    } 
    else 
    { 
     printf("Something wrong with choice, try again\n"); 
    } 
} 

void mystrdup(char* newString,char* originalString) 
{ 

    newString=malloc(strlen(originalString)+1); 
    if(newString==NULL) 
    { 
     printf("newString, error allocation Terminate program\n"); 
     exit(0); 
    } 
    else 
    { 
     strcpy(newString,originalString); 

    } 
} 

int main() 
{ 
    typedefAndStructHandle(1,"dummy"); 

} 

該程序將複製單詞「dummy」並將其寫入鏈接列表中。我創建了我自己的strdup,名爲mystrdup。我認爲mystrdup有問題。在生產線

printf("structList->string: %s\n",structList->string); 

它應該打印字structList->string: dummy但我的輸出是structList->string: null沒有人有任何想法如何解決呢?

+1

你'mystrdup'功能是有缺陷的,它修改*** ***局部變量'newString'的這一功能DE值。而且,當函數返回時,所有局部變量都將超出範圍,並且對它的所有更改都將丟失。正常的'strdup'函數返回*新字符串是有原因的。 –

回答

0

mystrup需要返回字符串,而不是將其作爲參數。

所以,用

char* mystrdup(char* originalString) 

更換

void mystrdup(char* newString,char* originalString) 

然後聲明newString本地和返回。

調用者需要保存返回值的變量,並最終調用free

+0

或者,它可以接受'char ** newString'。 – Dai

0
void mystrdup(char* newString, char* originalString) 

你是一個局部變量(newString),其壽命比函數結束預留空間,而是返回從函數指針:

char *mystrdup(char *originalString) 
{ 
    char *newString = malloc(strlen(originalString) + 1); 
    ... 
    return newString; 
} 
0

你可以試試這個:

void mystrdup(char* originalString) 
{ 
structList->string = originalString; 
} 

不需要或不知道你想要完成的功能。 當你打電話的strcpy裏面是空的,所以當你打印給你NULL