2013-01-21 48 views
0

我具有這樣的結構:
C不能添加新元素STRUCT

typedef struct kodProgramu { 
    char* etykieta; 
    char* instrukcja; 
    char* operand; 
    struct kodProgramu *nast; 
} kodPrg; 

該代碼可用於添加新的元素:

void pobierzKodStdin(kodPrg *kod, char *wynik, char *linia, int flagaEtyk) 
{ 
    wynik = fgets(linia, 80, stdin); 
    while(wynik != NULL) 
    { 
     kodPrg *wsk, *nowy; 
     wsk = kod; 
     while(wsk->nast != NULL) 
      wsk = wsk->nast; 

     if(linia[0] == ' ') 
      flagaEtyk = 1; 

     nowy = (kodPrg*)malloc(sizeof(kodPrg)); 
     int licznik = 0; 
     char *pch; 
     pch = strtok(linia, ":# "); 
     while(pch != NULL) 
     { 
      if(flagaEtyk == 0) 
      { 
       if(licznik == 0) 
        nowy->etykieta = pch; 
       else if(licznik == 1) 
        nowy->instrukcja = pch; 
       else if(licznik == 2) 
        nowy->operand = pch; 
      } 
      if(flagaEtyk == 1) 
      { 
       if(licznik == 0) 
        nowy->instrukcja = pch; 
       else if(licznik == 1) 
        nowy->operand = pch; 
      } 

      licznik++; 
      pch = strtok(NULL, ":# "); 
     } 
     nowy->nast = NULL; 
     wsk->nast = nowy; 

     flagaEtyk = 0; 
     wynik = fgets(linia, 80, stdin); 
    } 
} 

此功能打印該結構到控制檯:

void wypiszKod(kodPrg *kod) 
{ 
    kodPrg *wsk = kod; 
    while(wsk != NULL) 
    { 
     printf("%s %s %s\n", wsk->etykieta, wsk->instrukcja, wsk->operand); 
     wsk = wsk->nast; 
    } 
} 

這是我的主要功能:

int main() 
{ 
    char linia[80], *wynik; 
    char *wsk = malloc(sizeof(char)); 
    int flagaEtyk = 0; 
    //tasmaWejsc *wejscie = (tasmaWejsc*)malloc(sizeof(tasmaWejsc)); 
    //tasmaWyjsc *wyjscie = (tasmaWyjsc*)malloc(sizeof(tasmaWyjsc)); 
    //wyjscie->wartosc = 0; 
    //wyjscie->nast = NULL; 
    kodPrg *kod = (kodPrg*)malloc(sizeof(kodPrg)); 
    kod->etykieta = " "; 
    kod->instrukcja = " "; 
    kod->operand = " "; 
    kod->nast = NULL; 
    int liczba; 

    //wprowadzWejscie(wynik, linia, wejscie); 
    //wypiszWejscie(wejscie); 

    //system("cls"); 

    pobierzKodStdin(kod, wynik, linia, flagaEtyk); 
    wypiszKod(kod); 

    return 0; 
} 

現在,當我輸入一行如:測試測試測試 它運行良好,並在控制檯中打印測試測試測試。

但是,當我輸入更多的線,例如:

test test test 
xxxx xxxx xxxx 

該計劃是打印:

xxxx xxxx xxxx 
xxxx xxxx xxxx 

這就像第二行替換第一個。 我不知道爲什麼,當我有一個int而不是char *的結構,它工作良好。下一個元素被添加並且它的打印效果很好,但是當char *按照上面描述的方式工作時。

如何將新的elemnt添加到列表中,當我有char *結構?

+0

請參閱http://stackoverflow.com/questions/12066046/array-of-structs-deleting-adding-elements-and-printing –

+0

將源代碼(變量和函數名稱,註釋)完全保存在一個優點英語。實際上,它可以提高你的英語水平,並且提高了你的代碼的可讀性(除非你的英語真的很糟糕)。這是來自非英語母語的人,他認爲包含他的母語(德語)標識符的代碼看起來有些「破碎」。 – DevSolar

+0

@DevSolar同意 - 雖然,'sofern(條件){...} widrigenfalls {...}有一定的魅力。 –

回答

0

我想你應該明白一個靜態緩衝區strtok的作品

所以,當你寫這樣

pch = strtok(linia, ":# "); 
while(pch != NULL) 
{ 
    if(flagaEtyk == 0) 
    { 
    if(licznik == 0) 
    nowy->etykieta = pch; 

你指定你的閃亮堆元素的指針指向一個字符串,會消失下一行(linia)。

wynik = fgets(linia, 80, stdin);

你需要做的是使字符串的副本,這可以使用的strdup()

 nowy->etykieta = strdup(pch); 
+0

非常感謝這個解決方案。 –

+0

只是不要忘記後來釋放內存。 strdup分配需要釋放的內存。 –

0

在鏈接列表中的每個字符串被映射到linia[80]部分來完成,它在每個線路訪問時被覆蓋。

一些strdup()調用應該可以解決您的問題。