[英]Strtok_r segmentation fault
我知道之前已经问过,但之前的答案都说你不能修改字符串文字,除非我误解我不是。 我可以使用strtok_r直到最后一行输入,然后我得到一个seg错误。 为什么会这样? 这是我的代码的简化版本。 从打印我知道它通过get b处理,但是有一个seg错误?
#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
使用相同字符串的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
适合我(MS Visual C ++)。 唯一的区别是使用strtok_s
而不是strtok_r
因为它是Windows而不是POSIX。
在这里,我为您的代码添加了一些修改。
#include <string.h> //strlen
#include <stdlib.h>
void handler(char * input){
char * end_str;
char * token =strtok_s(input, "\n", &end_str); // tokenize input string
char * endd_str;
char * token2 = NULL;
while(token!=0){
printf("%s\n",token);
token2 = strtok_s(token, " ", &endd_str); // retokenize first token
while(token2 !=0){
printf("%s\n",token2); // replace printf call to avoid null string output and first token miss
token2 =strtok_s(NULL," ",&endd_str);}
token = end_str; // "important" restore char pointer to point the last untokenized input character
token=strtok_s(token,"\n",&end_str); // the same as printf issue is for all loops body
}
}
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.