2012-11-28 47 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];