2016-11-27 119 views
0

我有結構和我有這樣的結構化類型的陣列,我試圖使用用於初始化數組元素但字符串數組是相同結構類型數組初始化

#include "stdafx.h" 
#include "string.h" 

#define NUMBER_OF_STARS   200 
#define NUMBER_OF_PLANETS  200 

//== STAR STRUCTURE ==// 
// NAME | DIAMTER | TEMPERATURE | COMPANION PLANET/S // 
//== END STRUCTURE ==// 
typedef struct _star 
{ 
    char *name; 
    int diameter; 
    int temperature; 

}star; 
//== STAR STRUCTURE ==// 
// NAME | DISTANCE TO STAR | TWIRLING STAR | SPEED IN SPACE // 
//== END STRUCTURE ==// 
typedef struct _planet 
{ 
    char *name; 
    int distance_to_star; 
    char *twirling_star; 
    int speed_in_space; 
}planet; 
typedef struct _galaxy 
{ 
    star s_star; 
    planet s_planet; 
}galaxy; 

int main() 
{ 
    star s_star[NUMBER_OF_STARS]; 
    printf("Create your STARS\n"); 
    for (int i = 0; i < 200; ++i) 
    { 
     printf("Enter name of STAR\n"); 
     char s_name[20]; 
     scanf_s(" %s", s_name, 20); 
     printf("Enter diameter of STAR\n"); 
     int s_diameter; 
     scanf_s(" %i", &s_diameter); 
     printf("Enter temperature of STAR\n"); 
     int s_temperature; 
     scanf_s("%i", &s_temperature); 
     char s_com_planet[20]; 
     printf("\n"); 
     s_star[i] = { s_name,s_diameter,s_temperature }; 
     printf("Would you want to create another one?(YES/NO)\n"); 
     char cmd_answer[5]; 
     scanf_s("%s", cmd_answer, 5); 
     if (strstr(cmd_answer, "YES")) continue; 
     else if(strstr(cmd_answer, "NO")) break; 
     else break; 
     //printf("Name of STAR:\t\t%s\nDiameter of STAR:\t%i\nTemperature of STAR:\t%i\n\n", s_star->name, s_star->diameter, s_star->temperature); 
    } 

    printf("%s", s_star[1].name); 

    for (;;); 
    return 0; 
} 

並且當我進入例如:

name1 
1 
1 

不是再次

name2 
2 
2 

然後再

name3 
3 
3 

Visual Studio中顯示,s_star陣列s_star[0].names_star[1].names_star[2].name的是在我的情況下輸出同樣是name3 誰能弄清楚這一點,並解釋我,我在做什麼錯。

+2

對於每個char * struct成員,您正在讀入一個自動(堆棧)數組並將char *成員設置爲指向它。您可以通過保存指向malloc'd內存的指針來解決問題。 – PSkocik

回答

0

star包含指針。您可以將數組初始化爲0,如下所示:

star s_star[NUMBER_OF_STARS] = { 0 }; 

如果star不包含指針,你可以聲明中初始化:

star s = { 0,123,456 }; 
//or 
star array[] = { {1,2,3}, {4,5,6} }; 

但在這種情況下,你必須手動設置成員:

//(in this case is not necessary to check the previous value) 
if (s_star[i].name) 
    free(s_star[i].name); 

s_star[i].name = malloc(strlen(s_name) + 1); 
strcpy_s(s_star[i].name, (strlen(s_name) + 1), s_name); 

s_star[i].diameter = s_diameter; 
s_star[i].temperature = s_temperature; 

與您的問題沒有關係,但在Visual Studio中使用system("pause")而不是for(;;);以調試模式暫停程序。

+0

在C99及更高版本中,您可以使用「複合文字」一次性完成分配。雖然(可以用'strdup()'完成),但仍然需要複製字符串。 –

+0

@JonathanLeffler我不知道你的意思。 's_star [i] = {s_name,s_diameter,s_temperature};'或's_star [i] = {0,0,0};'甚至不在Visual Studio中編譯,我不知道OP如何工作。我無法在gcc中進行編譯。也許你可以添加另一個答案。 –

+1

這不是一個複合文字 - 但是這是:'s_star [i] =(星){s_name,s_diameter,s_temperature};'。 '施放'是施工的關鍵組成部分。複合文字是C99的一個功能,它甚至可能在MSVS中不可用,但它們在GCC中可用。 –