(C++)将string型vector中的元素复制到char型数组中。。出错!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(C++)将string型vector中的元素复制到char型数组中。。出错!相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

int main()

string word;
vector<string> text;
while (cin >> word)
text.push_back(word);

char *p = new char[text.size() + 1];
for (vector<string>::iterator ix = text.begin();
ix != text.end();
++ ix)
strcpy(p,(*ix).c_str());
p++;

*p = '\0';
for (vector<string>::iterator cit = text.begin();
cit != text.end(); ++cit)
cout << *cit;
cout << endl;
cout << p;
delete [] p;
return 0;


编译可以通过,找了半天不知错在哪。。请点拨一下!谢谢啦!

1、把word转换为其他字符组合,因为windows下word是一种数据类型,会有风险;
2、 char *p = new char[text.size() + 1];这句有错误,请楼主查阅vector的size()方法返回值代表的是什么。最笨的方法就是在vector中逐个string的长度相加获得字符串的长度,最后要加1.
参考技术A char *p = new char[text.size() + 1];
你要把vector内每个string的内容复制到 p ,这样定义又是什么意思?
你是不是想
char *p[] = new char[text.size() + 1]; ?
如果这样,p的每个元素也要单独分配空间 ,而且后来 delete 也要分别清除

将 vector<string> 元素复制到其他其他 vector<string>* (1 作为指针传递)

【中文标题】将 vector<string> 元素复制到其他其他 vector<string>* (1 作为指针传递)【英文标题】:copy a vector<string> elements to other other vector<string>* (1 passing as pointer) 【发布时间】:2019-12-19 05:58:52 【问题描述】:
void check_and_fix_problems(vector<string>* fileVec, int index) 

    vector<string> q =  "something", "else", "here" ;

    q.insert(q.end(), fileVec->begin() + index + 2, fileVec->end()); //add at the end of q vector the fileVec vector

    for (int f = 0; f < q.size(); f++) //here is the problem/s
        std::copy(q.at(f).begin(), q.at(f).end(), fileVec->at(f)); //copy q vector to fileVec
        //fileVec->at(f) = q.at(f);
    

我对这段代码有疑问,当我调用它时,我得到 fileVec 向量超出范围的运行时错误(我猜是因为 q 向量的元素比 fileVec 多,所以一些索引超出范围)但是我怎么能通过指针增加向量的向量大小?

并且在这里使用 std::copy 也很重要,或者我可以简单地使用 fileVec->at(f) = q.at(f); 做同样的事情? (因为我知道,当这个函数返回时,函数中的所有内容都将被删除,结果将是 fileVec 中的所有元素都显示在 nullptr)。

【问题讨论】:

如果没有minimal reproducible example,我们只能猜测您的问题。 index 可能超出范围,fileVec 可能为空或其他。请edit您的问题包含最少和完整的代码来重现您的问题 你能说出你想在这段代码中做什么吗?是否将向量 q 的内容复制到特定索引处的向量 fileVec 中? 请澄清:所以首先你将fileVec 附加到q,然后......你想做什么? *fileVec = q; 而不是您的 for 循环以什么方式不能回答您的问题? @Giannis 您至少可以澄清您的问题或评论,让我们知道问题是否已解决,或者提供的答案是否有用。 【参考方案1】:

所以我在这里尝试修复您的代码,尽管我仍然不知道您到底在做什么。我假设您需要在另一个向量的给定索引处插入另一个向量元素。一旦您说出确切的要求,就可以进行相应的修改:

void check_and_fix_problems(std::vector<string> &fileVec, int index) 

    std::vector<string> q =  "something", "else", "here" ;

    q.insert(q.end(), fileVec.begin() + index + 2, fileVec.end()); //add at the end of q vector the fileVec vector

    //for debugging purpose
    std::cout << "q in function contains:";
    for (std::vector<string>::iterator it = q.begin() ; it < q.end(); it++)
        std::cout << ' ' << *it;
    std::cout << '\n';

    //vector<string>::iterator itr;
    // for (itr = q.begin(); itr != q.end(); itr++) //here is the problem/s
    //     fileVec.insert(fileVec.begin() + index,*itr); //copy q vector to fileVec
    //     //fileVec->at(f) = q.at(f);
    // 
    fileVec.insert(fileVec.begin() + index, q.begin(),q.end());


int main ()

    std::vector<string> a = "xyz","abc","says","hello";
    check_and_fix_problems(a, 1);
    std::cout << "a contains:";
    for (std::vector<string>::iterator it = a.begin() ; it < a.end(); it++)
        std::cout << ' ' << *it;
    std::cout << '\n';
    return 0;

这给出了以下输出:

q in function contains: something else here hello
a contains: xyz something else here hello abc says hello

【讨论】:

以上是关于(C++)将string型vector中的元素复制到char型数组中。。出错!的主要内容,如果未能解决你的问题,请参考以下文章

将元素从 std::vector 复制到 std::stack c++

将 vector<string> 元素复制到其他其他 vector<string>* (1 作为指针传递)

将 vector<vector<string>> 转换为 map<string, string> c++ 时奇怪的第一个元素

C++ 中 vector 如何实现内存分配

c++使vector<string>容器中几个元素组成一个字符串,作为vector容器的第一个元素?

C++ Primer 5th 阅读笔记:字符串,vector 和数组