打印字符串从C函数返回为char *

时间:2012-11-28 03:30:32

标签: c shell

我正在用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?

知道为什么会这样吗?

感谢。

2 个答案:

答案 0 :(得分:3)

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

char *token = malloc(50);

然后你必须记得在完成后通过调用

来释放字符串
free(token);

答案 1 :(得分:1)

这是因为您正在访问垃圾值。在nextToken()结束之后,释放了自动的令牌,成为调用者的垃圾值。要解决此问题,请将变量的生命周期更改为静态或执行动态内存分配。但是你知道它的大小,它可能不是首选。只是做:

static char token[50];