我正在用C编写一个简单的shell程序。作为程序的一部分,我正在编写一个tokenizer来将用户输入分解为tokens。每次调用tokenizer时,它都会返回下一个标记。 tokenizer的代码如下所示:
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 一 二 &LT; 三 | 脚本 一个 b &GT; 文件
但是,当我删除nextToken中的“puts”行并将其放入main函数时,如下所示:
while(*token!='\0')
{
puts(token);
token = nextToken(inputString);
}
并尝试从我的main函数打印令牌,我看到的只是一个奇怪的字符列表,如下所示:
BHD? BH BH BHD BHD?
BHD?
知道为什么会这样吗?
感谢。
答案 0 :(得分:3)
您正在堆栈上分配字符串token
。这意味着当您返回它时,它将被取消分配,并且不能再使用。你应该为你的字符串分配内存:
char *token = malloc(50);
然后你必须记得在完成后通过调用
来释放字符串free(token);
答案 1 :(得分:1)
这是因为您正在访问垃圾值。在nextToken()结束之后,释放了自动的令牌,成为调用者的垃圾值。要解决此问题,请将变量的生命周期更改为静态或执行动态内存分配。但是你知道它的大小,它可能不是首选。只是做:
static char token[50];