我知道之前已经问过,但之前的答案都说过你不能修改字符串文字,除非我误解我不是。我可以使用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;
}
答案 0 :(得分:2)
您正在使用相同的字符串交错strtok_r
个调用。在内部while
循环的第二次迭代中,在调用token2 =strtok_r(NULL," ",&endd_str);
之前,endd_str
指向一个空字符串,因为它匹配的字符串到达了结尾,所以{{1} }返回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
}
}
答案 1 :(得分:1)
完美适合我(MS Visual C ++)。考虑到它是Windows而不是POSIX,唯一的区别是使用strtok_s
而不是strtok_r
。
这里我添加了一些代码修改。
#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;
}