我目前正在用C语言编写一种小编程语言。我从文件中加载一个脚本,然后使用strtok对其进行标记。问题是虽然在tokenizer函数中输出很好并且给了我预期的结果,但是当函数返回main时数据被破坏,给我输出如下:
╠ a
而不是预期的:
int
我没有很多C语言的经验,但我最好的猜测是这是一个空终止问题,虽然我已经读过strtok会自动这样做。
以下是相关代码:
int tokenize(char* script, char* tokens[]) {
char buffer[256];
strcpy(buffer, script);
char* token = strtok(buffer, " ");
int i = 0;
while (token) {
tokens[i] = token;
printf("token: %s\n", token);
token = strtok(NULL, " ");
i++;
}
printf("First token (tokenize): %s\n", tokens[0]);
return i;
}
int main(int argc, char* argv[]) {
// ....
char* script = read_script(argv[1]);
char* tokens[256];
int token_count = tokenize(script, tokens);
printf("First token (main): %s\n", tokens[0]);
// ...
}
这是控制台输出:
token: int
token: i
token: =
token: 0
First token (tokenize): int
First token (main): ╠ a
答案 0 :(得分:2)
您返回指向本地变量中的标记的指针:
{"name":"paste","sender":{"$":{"form_select_standardlanguage":
{"0":{},"1":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}},"2":
{"0":{},"1":{}}},"location":{"href":"http://somehost.com
/somefile.php","origin":"http:
//somehost.com","protocol":"http:","host":"somehost.com",
"hostname":"somehost.com","port":"","pathname":
"/somefile.php","search":"?searchkey=somekey","hash":""},
"data-cke-expando":102}},"data":{"$":{"isTrusted":true}}}
<{1}}返回后 int tokenize(char* script, char* tokens[]) {
char buffer[256];
...
不再存在。
答案 1 :(得分:1)
您的tokenize
- 调用对局部变量tokens[]
进行操作,并且 tokens[i] = strdup(token);
返回后,为此变量保留的内存不再有效。因此, tokens[i] = token;
中的任何指针都将指向(无效)内存。
为了解决这个问题,我写了
token[i]
代替
M
一旦不再需要这些元素,请确保调用者释放为每个decimal
元素保留的内存。
答案 2 :(得分:0)
令牌指向的内存空间(缓冲区)位于堆栈中。因此,当&#34; tokenize&#34;功能结束时,该空间就会消失。 所以,你和#34;令牌&#34;变量必须指向堆区域。(通过使用malloc或calloc。)