2015-12-21 132 views
-3
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define SIZE 20 

typedef struct arr { 
    char name[SIZE]; 
} arr; 

typedef struct tz{ 
    struct arr *next; 
} tz; 


int main() { 
    tz *tze; 
    const char *value[SIZE]; 
    tze = (tz*) malloc(sizeof(tz)*5); 
    int i; 

    for(i = 0; i < 5; i++) { 
     printf("insert value:\n"); 
     scanf("%s", value); 
     strcpy(tze[i].next->name, value); 
    } 

    for(i = 0; i < 5; i++){ 
     printf("output:%s ",tze[i].next->name); 
    } 
    return 0; 
} 

嗨,上面有一個代碼示例是我的問題。我想通過數組在每個單元格的鏈接列表中輸入字段「名稱」中的信息。不幸的是,來源不正確。一些想法?帶結構字段指針的結構

int main() { 
    tz *tze; 
    char *value; 
    tze = (tz*) malloc(sizeof(tz)*5); 
    value = (char*) malloc(sizeof(char)*SIZE); 
    int i; 



    for(i = 0; i < 5; i++) { 
     printf("insert value:\n"); 
     fgets(value, SIZE, stdin); 
     strncpy(tze[i].next->name, value,SIZE); 
    } 

    for(i = 0; i < 5; i++){ 
     printf("output:%s ",tze[i].next->name); 
    } 
    return 0; 
} 

我改變了我的代碼,但它仍然不起作用。我仍然得到一個信號錯誤的錯誤。如果我使用:

strcpy(tze[i].next->name, value[i]); 

我得到一個錯誤的指針,我相信有值[I] IM指向只有價值firts細胞。在沒有[i] im的情況下帶有價值的Insteal通常指向整個向量。

+0

爲什麼你認爲源是不正確的?你的編譯器是否打印出錯誤? –

+1

[請參閱此討論關於爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+0

感嘆。什麼是不正確的?它是否編譯?你期望什麼輸出。實際產出是多少?你的意見是什麼? –

回答

1
const char *value[SIZE]; 

您已聲明指向char的指針數組。但是你沒有將內存分配給數組中的每個指針。

您在其中輸入輸入,因此您需要爲陣列中的每個指針分配內存。

現在看到這個循環 -

for(i=0;i<5;i++){ 
    printf("insert value:\n"); 
    scanf("%s",value);   /*    <--problem */ 
    strcpy(tze[i].next->name,value);  /*  same here */ 
} 

傳遞value%s會導致未定義行爲%s需要一個char *和你通過指針數組。同樣的問題在strcpy

因此,正確的說法是 -

scanf("%s",value[i]);     // better use fgets 
strcpy(tze[i].next->name,value[i]);