【问题标题】:Can I use a pointer to traverse an array of strings?我可以使用指针遍历字符串数组吗?
【发布时间】:2014-08-24 04:02:03
【问题描述】:

那里。 我现在正在学习 C++ Primer。当我写一段程序时,关于指针的东西让我很困惑。 下面程序的功能是将字符串读入向量并将向量复制到字符指针数组中。对于向量中的每个元素,分配一个新的字符数组并将向量元素中的数据复制到该字符数组中。然后打印字符串数组的内容。

这是我的一段代码:

vector<string> str_vector;
string str_temp;
while(getline(cin,str_temp)){
    str_vector.push_back(str_temp);
}

typedef const char *cptr;
cptr *cptr_array = new cptr[str_vector.size()];

cptr *p = cptr_array;

for(vector<string>::iterator iter = str_vector.begin(); 
    iter != str_vector.end(); iter++,p++){
    *p = (*iter).c_str();
}

cout<<"Output Char Array Element"<<endl;
cptr *q = cptr_array;
while(*q){
    cout<<*q<<endl;
    q++;
}

delete [] cptr_array;

当我运行程序时,它会在输出字符串数组后崩溃。 我可以使用下面的代码来做同样的事情而不会崩溃。

cptr *q = cptr_array;
for(int i = 0; i < str_vector.size(); i++,q++){
    cout<<*q<<endl;
}

我只是想知道为什么上面的输出代码不能正常工作。非常感谢大家!

【问题讨论】:

    标签: c++ arrays string pointers vector


    【解决方案1】:
    *q = cptr_array;
    while(*q){
    

    循环不仅会在遍历数组后取消引用越界q,而且您也无法使用while(q) 进行测试,因为数组末尾没有nullptr sentinel。最简单的做法是在 cptr 中分配一个比你需要保存指向所有字符串值的指针的元素,然后将最后一个元素的指针值设置为 nullptr (0)。

    【讨论】:

    • 谢谢大卫,你的回答很详细而且很有帮助。我已经在我的代码中应用了你的建议,效果很好!
    【解决方案2】:
    while(*q){
    

    您使用*q 作为条件。数组遍历完后,q指向数组末尾之后的地方,访问*q是非法的。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 2022-11-11
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多