繁体   English   中英

向向量添加字符串 <const char *> 用strtok()给出奇怪的行为

[英]Adding string to vector<const char *> is giving weird behavior with strtok()

我试图将从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

如您所见,代码从令牌生成器获取了正确的字符串,但没有将正确的字符串推入向量。 这让我发疯,帮助并感谢您!

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

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

在C ++中,通常会构造一个std::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>作为数据类型,它将为您处理内存。

插入向量的是一个指针。因此在for之后,向量将存储相同的存储位置numStones 。如果要保存真实信息,请new一个内存块以将其保存,然后将其放入向量中。

这也发生在我身上。 这些评论主要对我有所帮助。 您必须创建一个char*辅助变量,并在每次读取新字符串时将其设置为新变量,以便每次都使用新地址。 之后,您只需push_back 喜欢

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM