2015-04-06 138 views
0

我有一個動態分配的指針數組,每個指針指向文件中的一行文本。我需要提取文件的第四列(文件中的值用逗號分隔),以便我可以稍後通過該列對文件進行排序。我已經能夠提取第四列文本,但是我無法返回它在我的主函數中使用,並且當我返回它時,它是空白的,可能是什麼問題?返回一個字符串文字?

getStart發現逗號所需的列

int getStart(char** addresses, int index) 
{ 
    int i = 0; 
    int count = 0; 

    for(i=0;i < strlen(addresses[index]); i++) 
    { 
      if(addresses[index][i] == ',') 
        count += 1; 
      if(count == 3) 
        return i+1; 
    } 
} 

getStop找到逗號權所需的列

int getStop(char** addresses, int index) 
{ 
    int i = 0; 
    int count = 0; 

    for(i=0;i < strlen(addresses[index]); i++) 
    { 
      if(addresses[index][i] == ',') 
        count += 1; 
      if(count == 4) 
        return i; 
    } 
} 

getSubject年底前前右通吃的人物在起始和終止,並把它們放到一個數組中(這是我需要返回到主)

char* getSubject(char** addresses, int index) 
{ 

    int i = 0; 
    int start; 
    int stop; 
    char* final; 
    char subject[10]; 

    start = getStart(addresses, index); 
    stop = getStop(addresses, index); 

    for(start; start<stop; start++) 
    { 
      subject[i] = addresses[index][start]; 
      i++; 
    } 
    final = subject; 
    printf("%s %s\n", final, subject); 
    return final; 

} 

,我知道該功能的工作方式是,

printf("%s %s\n", final, subject); 

打印出正確的價值觀,但是當我把它的主要如下:

char* test; 
    test = getSubject(addresses, 43); 
    printf("%s\n", test); 

測試打印空白值。爲什麼是這樣?

+0

做完那招沉默編譯器將是一個非常不好的習慣住在一起,覺得它的調用必須釋放它... –

回答

2

您將final指向本地數組subject,然後返回該指針。這意味着你實際上正在返回一個指向本地subject數組的指針,一個函數返回時超出範圍的數組,給你留下一個流浪的指針和undefined behavior


您需要爲最終的字符串分配內存,一般有這樣做的方法有兩種:

  1. 使用例如strdup在函數中分配內存並返回指向新內存的指針。

  2. 通行證在一個指向足夠存儲器的緩衝器作爲參數傳遞給該函數,並將該字符串複製到該緩衝液中。

+0

好了 - 所以我在函數調用中添加了'char * finalSubject',並且使用了'strcpy(finalSubject,subject)'並且調用了函數getSubject(addresses,subject,43);' - 現在我得到了一個分割錯誤? – Hazim

+0

@Hazim這是因爲在複製到'finalSubject'之前需要分配內存。增加了一些解決方案。 –

1

你正在返回一個指向堆棧變量的指針,你不能這樣做。一旦你回來,棧被清除。製作副本

return strdup(final); 

當它