Strtok_r 返回 NULL
Strtok_r returning NULL
我正在尝试对从文件中获取的字符串进行标记化。 strtok_r 在第一个子字符串上正常工作,然后在 returns 上正常工作(并且分段错误导致我尝试将 strndup 转换为另一个 var)
char buffer[500];
char * c;
char * c1;
char * c2;
//....
while(fgets(buffer, sizeof(buffer), f) != NULL){
c2 = buffer;
printf("%s\n", buffer);
c = strtok(c2, ":");
for(int i = 0; i < 4; i++){
c = strtok(NULL, ":");
printf("%s\n", c);
}
if(strcmp(c, argp->origen) == 0){
c = strtok(NULL, ":");
printf("%s\n", c);
if(strcmp(c, argp->destino) == 0){
nodo = malloc(sizeof(lista_vuelo));
c2 = buffer;
c = strtok_r(c2, ":", &c1);
nodo->IdReg = atoi(c);
printf("\n%d test\n", nodo->IdReg); //Works until here
c = strtok_r(NULL, ":", &c1);
printf("\n%s\n", c); //Prints null and then segmentation fault
nodo->Idvuelo = strndup(c, strlen(c));
printf("\n%s\n", nodo->Idvuelo);
//....
Input from file :
3:IBE3674:02-04-2019:19-45:马德里:柏林:巴拉哈斯:泰格尔:IBERIA:210:35:6:T4:60:N
Output :
3 测试 -> 预期输出
(null)
Violación de segmento (`core' generado) -> Segmentation fault, (null) should be IBE3674
strtok
不只是修改传递给它的指针,而是修改字符串本身。它用 null
字符替换每个找到的分隔符。
如果您有字符串 test:strtok:for:me
并在之后有 test[=14=]strtok:for:me
后调用 strtok
。
因此,当您迭代前几个标记时,每个 :
都会替换为 [=16=]
。如果您现在将指针 c2
重置为字符串的开头并再次调用 strtok,strtok 会在找到定界符之前找到一个 null
字符,并假定字符串在找到定界符之前结束并且 returns NULL
.
我正在尝试对从文件中获取的字符串进行标记化。 strtok_r 在第一个子字符串上正常工作,然后在 returns 上正常工作(并且分段错误导致我尝试将 strndup 转换为另一个 var)
char buffer[500];
char * c;
char * c1;
char * c2;
//....
while(fgets(buffer, sizeof(buffer), f) != NULL){
c2 = buffer;
printf("%s\n", buffer);
c = strtok(c2, ":");
for(int i = 0; i < 4; i++){
c = strtok(NULL, ":");
printf("%s\n", c);
}
if(strcmp(c, argp->origen) == 0){
c = strtok(NULL, ":");
printf("%s\n", c);
if(strcmp(c, argp->destino) == 0){
nodo = malloc(sizeof(lista_vuelo));
c2 = buffer;
c = strtok_r(c2, ":", &c1);
nodo->IdReg = atoi(c);
printf("\n%d test\n", nodo->IdReg); //Works until here
c = strtok_r(NULL, ":", &c1);
printf("\n%s\n", c); //Prints null and then segmentation fault
nodo->Idvuelo = strndup(c, strlen(c));
printf("\n%s\n", nodo->Idvuelo);
//....
Input from file :
3:IBE3674:02-04-2019:19-45:马德里:柏林:巴拉哈斯:泰格尔:IBERIA:210:35:6:T4:60:N
Output :
3 测试 -> 预期输出
(null)
Violación de segmento (`core' generado) -> Segmentation fault, (null) should be IBE3674
strtok
不只是修改传递给它的指针,而是修改字符串本身。它用 null
字符替换每个找到的分隔符。
如果您有字符串 test:strtok:for:me
并在之后有 test[=14=]strtok:for:me
后调用 strtok
。
因此,当您迭代前几个标记时,每个 :
都会替换为 [=16=]
。如果您现在将指针 c2
重置为字符串的开头并再次调用 strtok,strtok 会在找到定界符之前找到一个 null
字符,并假定字符串在找到定界符之前结束并且 returns NULL
.