0

我正在用 C 编写一个简单的 shell 程序。作为程序的一部分,我正在编写一个标记器来将用户输入分解为标记。每次调用标记器时,它都会返回下一个标记。标记器的代码如下所示:

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 一二 < 三 | 脚本 a b > 文件

但是,当我删除 nextToken 中的“puts”行并将其放入主函数时,如下所示:

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

并尝试从我的主函数中打印令牌,我所看到的只是一个奇怪字符的列表,如下所示:

£bHd? �bH �bH � �bHd � �bHd?

� �                                                                                                                                                                                                             还

知道为什么会这样吗?

谢谢。

4

2 回答 2

3

您正在token堆栈上分配字符串。这意味着当您返回它时,它将被释放,并且不能再使用了。您应该为您的字符串分配内存:

char *token = malloc(50);

然后你还必须记住稍后释放字符串,一旦你完成它,通过调用

free(token);
于 2012-11-28T03:32:34.900 回答
1

这是因为您正在访问垃圾值。在 nextToken() 结束后,自动令牌被释放,成为调用者的垃圾值。为了解决它,将变量的生命周期更改为静态或进行动态内存分配。但如您所知,它可能不是首选。做就是了:

static char token[50];
于 2012-11-28T03:38:44.067 回答