2014-04-17 51 views
0

我有一個使用命令行提示符argv和argc來接收字符串的程序。當我去運行代碼時,我經常遇到分段錯誤,經過大量研究,我無法確定可能導致此問題的原因。也許我如何執行代碼是問題?我使用的是gcc -o代碼code.c,然後./code一二三,其中一個兩個三是添加到鏈接列表的字符串。任何幫助確定我的錯誤可能會很大。C程序:使用argv,argc,分段錯誤創建鏈接列表

這裏是我的代碼:

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

typedef struct list_node_s{ 
    char the_char; 
    struct list_node_s *next_node; 
}list_node; 

void insert_node(list_node *the_head, char the_char); 
void print_list(list_node *the_head); 

int main(int argc, char *argv[]){ 
    char next_char; 
    list_node *the_head = NULL; 
    insert_node(the_head, next_char); 
    the_head->next_node = malloc(sizeof(list_node)); 
    if(the_head == NULL){ 
      return 1; 
    } 

    the_head->the_char = 1; 
    the_head->next_node == NULL; 
    int the_count, the_count2; 
    for(the_count = 0; the_count < sizeof(argv); the_count++){ 
      for(the_count2 = 0; argv[the_count][the_count2] != '\0'; the_count2++){ 
        next_char = argv[the_count][the_count2]; 
        insert_node(the_head, next_char); 
      } 
    } 

    print_list(the_head); 
    return (0); 
} 

void insert_node(list_node *the_head, char the_char){ 
    list_node * current_node = the_head; 
    while (current_node->next_node != NULL) { 
     current_node = current_node->next_node; 
    } 

    current_node->next_node = malloc(sizeof(list_node)); 
    current_node->next_node->the_char = the_char; 
    current_node->next_node->next_node = NULL; 
} 

void print_list(list_node *the_head){ 
    if(the_head == NULL){ 
      printf("\n"); 
    }else{ 
      printf("%c", the_head->the_char); 
      print_list(the_head->next_node); 
    } 

} 
+0

您的剪切和粘貼有問題嗎?什麼是'the_co $'? – Barmar

+0

'sizeof(argv)'幾乎可以肯定不是你想用作'for'限制的東西。 'argv'是一個指針,它的大小與參數的數量無關。這就是'argc'的用途。 – Barmar

+0

該行the_head-> next_node == NULL幾乎肯定是錯誤的。您可能想要說=(第27行) –

回答

1

更改此:

list_node *the_head = NULL; 
insert_node(the_head, next_char); 
the_head->next_node = malloc(sizeof(list_node)); 

到:

list_node the_head = { '\0', NULL }; 

初始化the_head到一個空的節點。

+0

謝謝你,這樣做! – lchristina26

+0

這就是我正在談論的@ Ichristina26 – Hugo

1

的一個問題是這樣的功能:

void insert_node(list_node *the_head, char the_char){ 
    list_node * current_node = the_head; 
    while (current_node->next_node != NULL) { 
     current_node = current_node->next_node; 
    } 

    current_node->next_node = malloc(sizeof(list_node)); 
    current_node->next_node->the_char = the_char; 
    current_node->next_node->next_node = NULL; 
} 

當你調用它main你基本上傳遞NULL因爲你設置the_headNULL。您試圖在while循環條件下訪問current_node->next_node,但由於您傳入的內容,您基本上正在執行NULL->next_node

您需要將您的頭部初始化爲空的list_node。基本上,因爲您使用的是char作爲節點元素,所以可以將char的值設置爲0x00,這會使其成爲零字節。那樣你就知道當你處於這個價值時,你就是頭腦。

我不是要自我推銷,但如果你想看看這個代碼看看這個github回購Barry_CS-331 Data Structures class。數據結構中有C和C++。我想它可能有一個列表,但如果沒有,你可以使用堆棧和隊列作爲一個整體的例子。

+0

那麼我在main方法或插入方法中將頭部初始化爲0x00?或者我正在初始化我的一個字符?我嘗試了一些你說的話,而且似乎沒有任何工作,所以我假設我做錯了... – lchristina26

0

方式一:

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

typedef struct list_node_s{ 
    char the_char; 
    struct list_node_s *next_node; 
}list_node; 

void insert_node(list_node *the_head, char the_char); 
void print_list(list_node *the_head); 

int main(int argc, char *argv[]){ 
    list_node *the_head = NULL; 
    int the_count, the_count2; 

    for(the_count = 0; the_count < argc; the_count++) 
     { 
     for(the_count2 = 0; the_count2 < strlen(argv[the_count]); the_count2++) 
      insert_node(&the_head, argv[the_count][the_count2]); 
     } 

    print_list(the_head); 
    return (0); 
    } 

void insert_node(list_node **the_head, char the_char){ 
    list_node *new_node; 
    list_node *tail_node; 

    /* Allocate and populate a new node. */ 
    new_node = malloc(sizeof(list_node)); 
    new_node->the_char = the_char; 
    new_node->next_node = NULL; 

    /* Is the_head already initialized? */ 
    if(*the_head) 
     { 
     /* Yes... find the tail_node. */ 
     tail_node = *the_head; 
     while(tail_node->next) 
      tail_node = tail_node->next; 

     /* Append the new_node to the end of the list. */ 
     tail_node->next = new_node; 
     return; 
     } 

    /* the_head was not initialized. The new_node will be the head node. */ 
    *the_head = new_node; 

    return; 
    } 

void print_list(list_node *the_head){ 
    if(the_head == NULL){ 
     printf("\n"); 
    }else{ 
     printf("%c", the_head->the_char); 
     print_list(the_head->next_node); 
    } 
} 
0

我已經修改你的代碼,也有一些錯誤:

1),主要錯誤是在此代碼。

for(the_count = 0; the_count < sizeof(argv); the_count++) 
{ 
     for(the_count2 = 0; argv[the_count][the_count2] != '\0'; the_count2++) 
     { 
      next_char = argv[the_count][the_count2]; 
      insert_node(the_head, next_char); 
     } 
} 

存在一些缺陷: 你水溼使用the_count < sizeof(argv),因爲argv類型是char* [];所以sizeof(argv)也許48,根據您的操作系統。

右邊是:

for(the_count = 1; the_count < argc; the_count++){ 
    for(the_count2 = 0; argv[the_count][the_count2] != '\0'; the_count2++){ 
     next_char = argv[the_count][the_count2]; 
     insert_node(the_head, next_char); 
    } 
    } 

2,該代碼aose有一些錯誤:

list_node *the_head = NULL; 
insert_node(the_head, next_char); 
the_head->next_node = malloc(sizeof(list_node)); 
if(the_head == NULL){ 
     return 1; 
} 

the_head->the_char = 1; 
the_head->next_node == NULL; 

insert_node(the_head, next_char);沒有必要,你最好做the_head->the_char = '\0',因爲焦炭1的是沒有打印字符。