gpt4 book ai didi

c - strtok_r 段错误

转载 作者:太空狗 更新时间:2023-10-29 15:35:06 25 4
gpt4 key购买 nike

我知道之前有人问过这个问题,但之前的回答说你不能修改字符串文字,除非我误解了,否则我不能。我可以成功地使用 strtok_r 直到输入的最后一行,然后出现段错误。为什么会这样?这是我的代码的简化版本。从打印中我知道它通过 get b 进行处理,但随后出现段错误?

#include <stdio.h>
#include <string.h> //strlen
#include <stdlib.h>

void handler(char * input){
char * end_str;
char * token =strtok_r(input, "\n", &end_str);
char * endd_str;
char * token2= strtok_r(token, " ", &endd_str);
while(token!=0){
printf("%s\n",token);
token=strtok_r(NULL,"\n",&end_str);
while(token2 !=0){
token2 =strtok_r(NULL," ",&endd_str);
printf("%s\n",token2);}
}

}

int main(int argc , char *argv[])
{
char test[100]="set a,10.5\nset b,11.5\nget b\nadd e,a,b\nsub g,a,b";
handler(test);
return 0;
}

最佳答案

您正在交错使用同一字符串的 strtok_r 调用。在内层while循环的第二次迭代中,在调用token2 =strtok_r(NULL,"",&endd_str);之前,endd_str点为空字符串,因为它匹配的字符串已到达末尾,因此 strtok_r 返回 NULL。将 NULL 传递给 printf 会导致段错误。

每次解析 "\n" 定界符后,重新开始循环遍历 "" 定界符。在你用尽内部的之前,不要再做外部的。此外,将您的 strtok_r 调用移动到循环的末尾,以便 while 条件正确检查它们。

您需要执行以下操作:

void handler(char * input){
char * end_str;
char * token =strtok_r(input, "\n", &end_str);
while(token!=0){
printf("%s\n",token);
char * endd_str;
char * token2= strtok_r(token, " ", &endd_str);
while(token2 !=0){
printf("%s\n",token2);
token2 =strtok_r(NULL," ",&endd_str); // call at end of loop
}
token=strtok_r(NULL,"\n",&end_str); // call at end of loop
}
}

输出:

set a,10.5
set
a,10.5
set b,11.5
set
b,11.5
get b
get
b
add e,a,b
add
e,a,b
sub g,a,b
sub
g,a,b

关于c - strtok_r 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34317739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com