0

我正在尝试将从 strtok 返回的字符串添加到向量中,但由于某种原因,它只添加了文件中的最后一个字符串......

代码:

// read the remaining lines
// put address and ports into ipaddr and ports, respectively
for (unsigned i = 0; i < numStones; ++i) {
    const char * item;
    fgets(buffer, 255, fp);
    //printf("%s", buffer);
    item = strtok(buffer, " ");
    printf("%s\n", item);
    ipaddr.push_back(item);
    item = strtok(NULL, "\n"); 
    printf("%s\n", item);
    ports.push_back(item);
}
#ifdef _DEBUG
for (unsigned i = 0; i < numStones; i++) {
    printf("IP Address %d: %s\n", i, ipaddr.at(i));
    printf("Port %d: %s\n", i, ports.at(i));
}
#endif

输出:

129.82.47.21
3360
129.82.47.22
5540
129.82.47.23
7732
129.82.47.24
8896
IP Address 0: 129.82.47.24
Port 0: 8896
IP Address 1: 129.82.47.24
Port 1: 8896
IP Address 2: 129.82.47.24
Port 2: 8896
IP Address 3: 129.82.47.24
Port 3: 8896

如您所见,代码从标记器获取正确的字符串,但没有将正确的字符串推送到向量。这让我发疯,帮助,谢谢!

4

3 回答 3

3

因为您在不分配新内存的情况下推送指针。您总是提供指向缓冲区中某个位置的指针。

在 C 中,您将使用strdup复制字符串。

在 C++ 中,您通常会构造 astd::string并将它们存储在您的向量中,而不是char *. 但是,您可能有自己的内存管理方案,其中存储在某处的字符串缓冲区。或者,您可以strdup根据需要使用。

我一般同意乔纳森波特对另一个答案的评论:

不鼓励在向量中存储指针

如果你是编程新手,你应该 100% 接受这个建议。当您更高级时,有时将指针放入向量中是完全合法的。


[编辑]澄清。

快速修复是这样的(是的,我们通常应该检查strdup没有返回NULL):

ports.push_back(strdup(item));

但这进行了清理工作,因为当您完成向量时,您需要释放所有这些指针:

for( int i = 0; i < ports.size(); i++ ) free(ports[i]);

更好的解决方法是std::vector<std::string>用作您的数据类型,它将为您处理内存。

于 2013-09-30T02:23:17.837 回答
0

你压入向量的是一个指针。所以在 之后for,向量存储相同的内存位置次numStones。如果你想保存真实的信息,new一个内存块来保存它,然后将它压入向量。

于 2013-09-30T02:22:40.170 回答
0

这也发生在我身上。主要是这些评论帮助了我。您必须创建一个char*辅助变量并在每次读取新字符串时将其设为新变量,这样地址每次都是新的。之后你就push_back. 喜欢

char* aux = new char[100]; strcpy(aux, your_str); vector.push_back(aux);

于 2018-04-17T11:07:21.377 回答