我遇到了问题,我需要有人解释发生了什么。
我正在解析像
a=1&b=2&c=3
这样的字符串,我想将其解析为 ["a=1","b=2","c=3"]
,然后拆分每个 x=y
。
这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void f2(char *src)
{
char *dest = (char *) calloc(strlen(src),sizeof(char));
strcpy(dest,src); // I copy src to dest to guard src from being messed up with strtok
// when I comment out the below line, src address doesn't change
// but why is it changing the src address? I have copied the src to dest!
char *token = strtok(dest, "=");
printf("dest addr: %p token addr: %p \n",dest,token);
}
void f1(char *src)
{
char *token = strtok(src, "&");
while (token)
{
printf("src addr: %p ", token);
f2(token);
token = strtok(NULL, "&");
}
}
我运行的代码如下:
TEST(CopyPointer, CopyStrTok)
{
char str[]="a=1&b=2&c=3";
f1(str);
}
结果如下:
src addr: 0x7ffd4a00ec0c dest addr: 0x558a755d3350 token addr: 0x558a755d3350 // it's fine
src addr: 0x558a755d3352 dest addr: 0x558a755d3370 token addr: 0x558a755d3370
// ^ ^
// now src addr is changed and it's pointing to the second character of dest
我无法解释为什么
src
被 f2
操纵,而我已将 src
复制到另一个名为 dest
的变量?
src
没有改变,您会看到变化,因为您不打印 src
仅 token
(但在您的格式字符串中是 src 而不是令牌)
更正版本
void f1(char *src)
{
char *token = strtok(src, "&");
while (token)
{
printf("src addr: %p token addr: %p ", (void *)src, (void*)token);
f2(token);
token = strtok(NULL, "&");
}
}