所以我试图在这个结构中存储一个字符串:
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的输出。它似乎只是在其开关块中设置node[i]的值,但我不确定为什么。当调试和查看gdb中的值时,node[i]值是在该开关块的情况下设置的。然而,当我查看整个数组(打印节点)时,它显示我没有在结构中设置name字段。当我完全离开开关块(在循环的新迭代中)并查看该节点的值(例如node[0])时,我也没有看到名称值设置在那里。
我不确定我做错了什么,我是C++的新手(熟悉C),但argv[I](它被投射到C++字符串AND中,是在开关的作用域之外声明的)或在循环迭代开始时被推回的新节点超出了作用域,这是没有意义的。
如有任何帮助,我们将不胜感激。谢谢
如果这是您的实际代码,那么它没有任何问题:
#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";
这些调试语句的输出有望让您更清楚地了解代码各个阶段的数据,并使您能够针对问题区域。
我发现了这个问题,它是在我的原始代码中的节点索引中(此处未显示)。