2016-03-08 74 views
0

我試圖運行一個代碼,但它無法生成。我想讀取3個不同的名稱,每個名稱最多40個字符,保存在一個矢量中並打印出來。我需要使用函數來完成它。我收到第15行的「可變大小的對象可能未初始化」。我相信,如果未定義向量的大小,我可能會得到此錯誤。我已經嘗試過使用常量(NOMESQUAN和NOMESTAM)和聲明(nomes [3] [41])來定義它,但每次都得到相同的錯誤。可變大小的對象可能未初始化 - C錯誤

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

#define NOMESQUAN 3 
#define NOMESTAM 41 

int lenomes(int i); 

int main() 
{ 
    int i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for(i=0; i<3; i++){ 
     char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/ 
    } 

} 

int lenomes(int i){ 
    char nome[NOMESTAM]; 

    printf("Digite o nome %d", i); 
    gets(nome); 

    return nome; 
} 
+4

'return nome;' - 不。你不能這樣做。 –

+1

你的代碼有多個問題,你想要做什麼? –

+1

您正在返回'lenomes'中'char'的指針,其中'int'作爲返回類型。你聲明瞭兩次'nomes'(一次在'main'的開頭,另一次在循環中)。 – ForceBru

回答

0

首先功能lenomes包含無意義的代碼,並且不會編譯。您不能從函數返回數組。而且你還沒有聲明函數返回一個數組,你已經聲明它返回一個int。你告訴我,這是如何有道理的。


炭nomes [NOMESQUAN] [NOMESTAM];

這裏聲明數組,但隨後的循環內再次聲明另一個數組char nomes[i][NOMESTAM],但此時作爲可變長度數組(因爲i是一個運行時間變量)。這樣的數組無法初始化,因爲它們只有在運行時獲取值纔有意義。


概括起來講,編程,你不能只是碰碰運氣的語言語法的時候,實際上你知道你寫的每一行呢。

你可能想要做這樣的事情,而不是:

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

#define NOMESQUAN 3 
#define NOMESTAM 41 

void lenomes (int i, char nomes[i][NOMESTAM]); 

int main() 
{ 
    int i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for(i=0; i<NOMESQUAN; i++){ 
     lenomes(i, nomes); 
    } 

} 

void lenomes (int i, char nomes[i][NOMESTAM]) { 
    printf("Digite o nome %d", i); 
    gets(nome[i]); 
} 
+0

_但是,請注意函數'gets'已經從C語言中刪除。據指出,該功能在25年前使用時本質上是危險的,因此17年前已經過時並在5年前完全移除。所以教你使用它的人不是學習C編程的好資源,他們的知識已經完全過時了。 – Lundin

0

在這份聲明中

char nomes[i][NOMESTAM] = lenomes(i); /*LINE 15*/ 

有定義試圖初始化變量長度數組。首先VLA可能無法初始化,並且在任何情況下初始化都不正確。

功能lenomes也是無效的。

int lenomes(int i){ char nome [NOMESTAM];

printf("Digite o nome %d", i); 
gets(nome); 

return nome; 

}

它試圖返回一個指針轉換爲類型,其具有將在退出功能後銷燬本地陣列的第一元素的地址int值。

考慮到功能gets不再受C標準支持,因爲它不安全。

你需要的東西像下面

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

#define NOMESQUAN 3 
#define NOMESTAM 41 

char * lenomes(char *nome, size_t n); 

int main(void) 
{ 
    size_t i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for (i = 0; i < sizeof(nomes)/sizeof(*nomes); i++) 
    { 
     lenomes(nomes[i], sizeof(nomes[i])); 
    } 
} 

char * lenomes(char *nome, size_t n) 
{ 
    char *p; 

    printf("Digite o nome "); 
    p = fgets(nome, n, stdin); 

    if (p) p[strcspn(p, "\n")] = '\0'; 

    return p; 
} 
0

隨着評論認爲表現在你的代碼中的問題的幫助,這裏是一個可能的實現。

#include <stdio.h> /* io functions MUST be declared */ 

#define NOMESQUAN 3 
#define NOMESTAM 41 

/* pass a buffer and a length to io routine */ 
char *lenomes(int i, char *buf, int sz); 

int main() 
{ 
    int i; 
    char nomes[NOMESQUAN][NOMESTAM]; 

    for(i=0; i<3; i++){ 
     lenomes(i, nomes[i], NOMESTAM); /*LINE 15*/ 
    } 

} 

char* lenomes(int i, char *nome, int sz){ 

    printf("Digite o nome %d", i); 
    return fgets(nome, sz, stdin); /* NEVER use gets */ 
} 
相關問題