无法将值存储到向量结构中

时间:2019-02-11 02:56:29

标签: c++ string vector

所以我正在尝试在此结构中存储字符串:

struct node{
    std::string name;
};

(大致)这样做:

int main(int argc, char *argv[]) {
    // ... other code ...

    std::vector<char> chars;
    chars.push_back('n');

    std::vector<node> nodes;
    for(int i = 0; i < argc; i++) {
        nodes.push_back(node());
        for(auto ch : chars) {
            switch(ch) {
                 case 'n': {
                     nodes[i].name = argv[i];
                     break;
                 }
             }
         }
     }

     // ... other code ...

     for(auto n : nodes) {
         std::cout << n.name << '\n';
     }
     return 0;
}

整个程序可以编译并运行,但是没有n.name的输出。似乎只在其switch块内设置node [i]的值,但我不确定为什么这样做。在调试和查看gdb中的值时,nodes [i]的值是在该切换块的情况下设置的,但是,当我查看整个数组(打印节点)时,它表明我尚未在结构中设置name字段。当我完全离开切换块(在循环的新迭代中)并查看该节点的值(例如,node [0])时,我也看不到在那里设置的名称值。

我不确定自己在做什么错,我是C ++的新手(熟悉C),但是argv [i](被转换为c ++字符串AND是声明在开关范围之外),或者在循环迭代开始时被推回的新节点超出范围。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

如果这是您的实际代码,则没有任何问题:

#include <iostream>
#include <vector>

struct node{
    std::string name;
};

int main(int argc, char *argv[]) {
    // ... other code ...

    std::vector<char> chars;
    chars.push_back('n');

    std::vector<node> nodes;
    for(int i = 0; i < argc; i++) {
        nodes.push_back(node());
        for(auto ch : chars) {
            switch(ch) {
                 case 'n': {
                     nodes[i].name = argv[i];
                     break;
                 }
             }
         }
     }

     // ... other code ...

     for(auto n : nodes) {
         std::cout << n.name << '\n';
     }
     return 0;
}

当我编译并运行它时,我得到了预期的输出:

pax$ ./testprog a b c
./testprog
a
b
c

因此,我不得不假设这不是您的实际代码,特别是因为创建包含'n'的单元素矢量然后基于该元素中的每个元素进行其他操作的行为向量'n'似乎有点错误,...奇怪(据我所知这是外交手段)。

我的建议是将您的代码缩减为最小的代码,然后将其发布。当我们拥有源代码时,调试代码就很难了,没有理由通过发布不同代码来使它变得更困难:-)


在没有看到实际代码的情况下,我们可以仍然提出一些有关如何识别问题出在哪里的建议。

首先,在您分配名称的地方,输出该名称以确保此时已正确设置它(在下面添加第二行):

nodes[i].name = argv[i];
std::cout << "Added #" << i << " with value '" << nodes[i].name << "'\n";
break;

第二,确保控制向量正在执行您期望的操作(在下面添加第二行)。每个参数应有n行:

for(auto ch : chars) {
    std::cout << "Control ch is '" << ch << "'\n";
    switch(ch) {

第三,在打印之前检查矢量大小,它应该不为零(在下面添加第一行):

std::cout << "Vector size is " << n.size() << "\n";
for(auto n : nodes) {
    std::cout << n.name << '\n';
}

您还应该在扩展向量的同时输出它(在下面添加第三行):

for(int i = 0; i < argc; i++) {
    nodes.push_back(node());
    std::cout << "Vector size on build is " << n.size() << "\n";

这些调试语句的输出有望使您更清楚地了解代码各个阶段的数据,并使您可以定位问题区域。

答案 1 :(得分:0)

我发现了问题所在,这是在原始代码中为节点建立索引(此处未显示)。