2012-11-28 79 views
0

我正在用C編寫一個簡單的shell程序。作爲程序的一部分,我正在編寫一個標記器以將用戶輸入分解爲標記。每次調用標記器時,都會返回下一個標記。標記器的代碼如下所示:打印字符串從C函數返回爲char *

char* nextToken(char string[]) 
{ 
char token[50]= {}; //stores the current token 
//More code here, will post if necessary 
puts(token); 
return token; 
} 

int main() 
{ 
char inputString[] = "cpgm one two <three| script a b >file"; 
char *token = nextToken(inputString); 
while(*token!='\0') //I'm using a char[] with a single null character as a delimiter to indicate the last token has been reached 
{ 
    token = nextToken(inputString); 
} 

} 

當我像這樣運行程序時,「puts」工作正常;也就是說,每個函數被調用時,相應的標記,印在正確的順序時,是這樣的:

cpgm 一個 < | 腳本 一個 b > 文件

然而,當我刪除了「看跌期權」行中的nextToken,並把它的主要功能,如:

while(*token!='\0') 
{ 
    puts(token); 
    token = nextToken(inputString); 
} 

,並嘗試打印令牌從我的主要功能,而不是我看到的奇怪字符列表,如下所示:

bHd? bH bH bHd bHd?

BHD?

任何想法爲什麼會發生這種情況?

謝謝。

回答

3

您正在堆棧上分配字符串token。這意味着當你返回它時,它將被釋放,並且不能再被使用。你應該爲你的字符串分配內存,而不是:

char *token = malloc(50); 

您還那麼一定要記得稍後釋放字符串,一旦你用它做,通過調用

free(token); 
+0

或'static char token [50]' – Jack

+0

哇,謝謝!有效!我一直在想這個好幾個小時! – tmldwn

1

這是因爲你正在訪問垃圾值。在nextToken()結束之後,自動的標記被釋放,成爲調用者的垃圾值。爲了解決它,將變量的生命週期更改爲靜態或執行動態內存分配。但是,如你所知,它可能不是首選。只要這樣做:

static char token[50];