【发布时间】:2017-05-26 23:27:59
【问题描述】:
我需要将字符串与文件分开。字符串 = "21:12:36 14:45:25 08:17:24" 当我执行 strtok() 并将所有标记放入数组时,一切正常,但是当我第二次执行 strtok() 时,一切都搞砸了。 示例:
char *p = strtok (code, " ");
while (p != NULL){
dal[i++] = p;
p = strtok (NULL, " ");
}
输出:
dal[0] = 21:12:36
dal[1] = 14:45:25
dal[2] = 08:17:24
我复制 dal 数组,当我第二次执行 strtok 时,我更改了原始字符串(代码)和 dal 副本,即使我传递了 dal 数组仅适用于 strtok()。我尝试将 dal 发送到 LinkedList,但在第二次 strtok 之后,甚至 LinkedList 都被更改了。
声明:
char *dal[20], *dalcopy[20];
//copying below
for(int k = 0; k<i; k++){
dalcopy[v] = dal[k];
v = v+1;
}
例子:
for (int j = 0; j<i; j++){
char *o = strtok(dal[j], ":");
while (o != NULL){
for(int h = 0; h<3; h++){
if(h == 0){vienas[b].Hour = atoi(o);}
if(h == 1){vienas[b].Min = atoi(o);}
if(h == 2){vienas[b].Sec = atoi(o);}
o = strtok (NULL, ":");
}
b = b+1;
}
链表示例:
char *p = strtok (code, " ");
while (p != NULL){
dal[i++] = p;
put(head, p); //puts each element to list end
p = strtok (NULL, " ");
}
printf("%s\n", show_by_index(&head, 0)); **Output == 21 after second strtok**
输出:
original string = 21
dal[0] = 21
dal[1] = 14
dal[2] = 08
dalcopy[0] = 21
etc...
为什么会这样?
【问题讨论】:
-
您的问题似乎缺少关键的代码。
dal和dalcopy是如何声明的? 如何dalcopy创建?复制指针数组不会复制这些指针指向的数据。我怀疑dalcopy是一个别名数组。 -
char *dal[20], *dalcopy[20];- dal 声明dalcopy[0] = dal[0]; -
请给minimal reproducible example。没有显示太多。
-
顺便说一句,
dalcopy[0] = dal[0];表明我的预感是正确的。您正在为同一字符串创建别名,而不是字符串的副本。您需要malloc存储副本,然后使用strcpy。strtok是一种破坏性功能,您创建的不是真正的副本,不会受到这种破坏。 -
这可能会有所帮助。但是为什么这个函数会触及 LinkedList 项呢?
标签: c string split linked-list strtok