2013-04-11 56 views
1

我有一個結構數組,在while循環內部添加東西到該數組,但是當我打印出數組時,我得到了錯誤的輸出? (添加的最後一個元素被打印出來n次,n是多少東西我加)全局數組在while循環內不更新?

我用Google搜索這一點,我認爲這是因爲在猛砸while循環創建一個子shell,也不太清楚。

任何幫助,將不勝感激 (請有耐心,我只是一個學生!)

使用Mac OSX山獅 的Xcode 4的gcc

代碼:

#include <stdio.h> 
#include <limits.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 

typedef struct{ 
    char* one; 
    char* two; 
} Node; 

Node nodes[100]; 
int count = 0; 

void add(char *one,char*two){ 
    Node newNode = {one,two}; 
    nodes[count]= newNode; 

    printf("one: %s\n",one); 
    printf("two: %s\n",two); 

    count++; 
} 

void print(){ 
    int x; 
    for (x = 0; x < 10; x++) 
     printf("%d : (%s, %s) \n",x,nodes[x].one, nodes[x].two); 
} 

void check(char **arg) 
{ 
    if(strcmp(*arg, "Add") == 0) 
     add(arg[1],arg[2]); 
    else if(strcmp(*arg,"print") == 0) 
     print(); 
    else 
     printf("Error syntax Enter either: \n Add [item1][item2]\n OR \n print\n"); 
} 

void readandParseInput(char *line,char **arg) 
{ 
    if (fgets (line, 512, stdin)!= NULL) { 
     char * pch; 
     pch = strtok (line," \n\t"); 
     int count = 0; 
     arg[0] = pch; 

     while (pch != NULL) 
     { 
      count++; 
      pch = strtok (NULL, " \n\t"); 
      arg[count] = pch; 
     } 
    }else{ 
     printf("\n"); 
     exit(0); 
    } 
} 

int main() 
{ 
    int i; 
    for(i = 0;i <100; i++){ 
     nodes[i].one = "."; 
     nodes[i].two = "."; 
    } 

    char line[512];    /* the input line     */ 
    char *arg[50];    /* the command line argument  */ 

    while (1) 
    { 
     readandParseInput(line,arg); 
     if(arg[0] != NULL) 
      check(arg); 
    } 
    return(0); 
} 
+0

在malloc上閱讀。 – Oren 2013-04-11 13:04:13

+0

如果你正確地縮進你的代碼,它會對你有很大的幫助。 – Shahbaz 2013-04-11 13:04:31

+1

這與在bash和subshel​​l中的循環無關。你的'nodes'是一個'Node'類型的數組,而不是'Node *',所以你不能'Node newNode = {one,two}; nodes [count] = newNode;'。 – Vicky 2013-04-11 13:05:17

回答

2

strtok()返回指向最初傳遞的緩衝區內的不同元素的指針。這意味着數組中的所有條目都將指向同一個緩衝區的不同元素,名稱爲line。你需要通過strtok()返回的指針的副本:

在這兩種情況下,內存必須是free() d時不再需要。

+0

需要釋放什麼?緩衝線? – 2013-04-11 17:52:55

0

這是因爲你對所有輸入使用相同的緩衝區。

您需要複製放入結構中的字符串。通過將數組用於字符串和strcpy,或使用strdup爲字符串分配新內存並在一個函數中執行復制。