gpt4 book ai didi

c - 在C中反序列化一个字符串

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:22 25 4
gpt4 key购买 nike

我有以下格式发送的数据

1 2 5
1 3 6
1 4 9

我正在使用以下函数反序列化它们

 void deserialize(RV** arr, char* msg){
int idx = 0;
char* line = strtok(msg, "\n");
RV rv;
rv.server1 = atoi(strtok(line, " "));
rv.server2 = atoi(strtok(NULL, " "));
rv.weight = atoi(strtok(NULL, " "));
memcpy(arr[idx], &rv, sizeof(rv));
idx++;

while (strtok(NULL, "\n") != NULL){
//printf("%s\n", line);
RV rv;
rv.server1 = atoi(strtok(NULL, " "));
rv.server2 = atoi(strtok(NULL, " "));
rv.weight = atoi(strtok(NULL, " "));
memcpy(arr[idx], &rv, sizeof(rv));
idx++;
}

}

这正确返回了第一行,但其余的都是0

1 2 5
0 0 0
0 0 0

我做错了什么。任何帮助表示赞赏。

最佳答案

您遇到的问题之一是 strtok函数不可重入,这意味着您不能使用它来标记两个不同的字符串。如果你有 strtok_s 你可以使用它,或者你可以使用简单的 sscanf在每一行上解析。

另一个问题是您没有在循环中获取新行。


你可以很容易地用这样的东西替换你的代码:

int deserialize(RV** arr, char* msg)
{
char *line = strtok(msg, "\n");
int idx = 0;

do
{
sscanf(line, "%d %d %d", &arr[idx]->server1, &arr[idx]->server2, &arr[idx]->weight);
++idx;
} while ((line = strtok(NULL, "\n")) != NULL);

return idx; // Return the number of lines we parsed
}

这假定消息中至少有一行(以换行符结尾)。另请注意,我写的代码是我的头顶,我没有测试过。

关于c - 在C中反序列化一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33916748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com