C++ 从字符串指针C++;

C++ 从字符串指针C++;,c++,string,pointers,C++,String,Pointers,所以我在做一个项目,我必须从文件中读取内容,然后分析它们。但是我在从包含我需要的地址的指针中获取字符串时遇到了问题 string lePapel(vector<char> vec){ string *str, s; int i, j = 0; vector<char> aux; aux.resize(6); for (i = 57; i <= 62; i++){ aux[j] = vec[i];

所以我在做一个项目,我必须从文件中读取内容,然后分析它们。但是我在从包含我需要的地址的指针中获取字符串时遇到了问题

string lePapel(vector<char> vec){
    string *str, s;
    int i, j = 0;
    vector<char> aux;
    aux.resize(6);
    for (i = 57; i <= 62; i++){
        aux[j] = vec[i];
        j++;
       }
    str = new string[aux.size()];
    for (i = 0; i < 6; i++){ str[i] = aux[i]; }
return s;
}
string-lePapel(向量向量向量){
字符串*str,s;
int i,j=0;
矢量辅助;
辅助调整大小(6);

对于(i=57;i字符串对象的动态数组和整个
aux
向量在这里似乎完全没有必要(除非代码中有其他用途)。此外,
str
当前正在导致内存泄漏,因为您在完成时从未
删除它

一种更简单的方法是将字符一次一个地附加到
s
string对象(假设它是
std::string
):


我建议您在本例中不要在字符串上使用指针。以下代码可能就是您想要的:

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

using namespace std;

string lePapel(vector<char> vec){
    int j = 0;
    vector<char> aux;
    aux.resize(6);
    for (int i = 57; i <= 62; i++){
        aux[j] = vec[j];
        j++;
    }
    string str;
    str.reserve(6);
    for (int i = 0; i < 6; i++){ str.push_back(aux[i]); }

    return str;
}

int main() {
    char x[5] = {'A', 'B', 'C', 'B', '4'};
    vector<char> vec(x, x + 5);
    string s = lePapel(vec);
    cout << s;

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
字符串lePapel(向量向量向量){
int j=0;
矢量辅助;
辅助调整大小(6);

对于(int i=57;i简短回答,您不需要
string*
您需要
char*
。您创建的是
string
数组。string对象包含指向您试图捕获的
char*
数据的指针。此外,
sizeof(std::string)
(8字节大小)比
sizeof(char)大得多
(大小为1字节)存储的第二个字符与第一个字符的距离为8字节,而不是相邻


有很多其他C++风格和安全问题,但我将坚持这个问题。)< /P>是代码>字符串< /代码> A<代码> STD::String < /C> >尝试<代码> S.PuthBuffBug(AUX[i])<代码>在for for循环<代码>返回STD::String(& VEC(57),62-57)是的。string是std::string。我正在使用名称空间std。因为我要回复之前回复的人,他指出我返回的是s而不是str:哦,天哪,我没有注意。在返回s之前,我有s=*str;。我在没有注意的情况下复制并粘贴了。对此表示歉意。之后返回s不会给我任何错误,但我有没有关于如何迭代并获得我想要的全部内容的线索,而不仅仅是“A”.然后,返回*str确实是一样的,并且让我遇到了同样的问题,不知道如何重复它。哦,太好了!谢谢你了。这非常好。我很惊讶我之前没有想到这一点。现在有点尴尬。再次感谢你的回答。彼得。是的,你对这一点非常正确。t这只是一个混乱的方式,几乎让我得到了一个不错的结果。我按照上面的建议使用了push_back,效果很好。我会清理代码,可能会与您的解决方案混淆!请阅读您编辑的部分。感谢您解释如何正确操作。我可能以后需要它,并感谢您的提醒,我真的忘了删除动态数组我建议使用

s.reserve(6)
如果你想在
s
上使用
push_back
。在这种情况下,保留和调整数组大小有什么特别的不同吗?理论上,调整数组大小可能比保留类似的大小要快一些,因为你事先知道所需的大小。你只需要使用
s[i]=..
而不是
s+=..
。我想你会提到不必要的变量以及由于不删除*str而导致的内存泄漏,对吗?…j永远不会被读取,vector会给你一个构造函数来分配一个大小,而且…还有很多。
for (i = 0; i < 6; i++) s += str[i];
delete [] str; //<-- very important!
#include <iostream>
#include <string>
#include <vector>

using namespace std;

string lePapel(vector<char> vec){
    int j = 0;
    vector<char> aux;
    aux.resize(6);
    for (int i = 57; i <= 62; i++){
        aux[j] = vec[j];
        j++;
    }
    string str;
    str.reserve(6);
    for (int i = 0; i < 6; i++){ str.push_back(aux[i]); }

    return str;
}

int main() {
    char x[5] = {'A', 'B', 'C', 'B', '4'};
    vector<char> vec(x, x + 5);
    string s = lePapel(vec);
    cout << s;

    return 0;
}