将字符串数组转换为char多个char * []

问题描述 投票:0回答:2

我有以下代码:

#include <iostream>
#include <string>
using namespace std;

int main(){
    string text;
    string * OldArray = nullptr;
    string * NewArray = nullptr;
    unsigned int counter = 0;

    cout <<"Enter StringS" <<endl;
    while(true){
        cin >> text;
        if (text.find("End") != string::npos ) break;
        NewArray = new string[counter +1];
        for(int i = 0; i < counter; i++){
            NewArray[i] = OldArray[i];
        }
        NewArray[counter] = text;
        delete [] OldArray;
        OldArray = NewArray;
        counter++;
    }

    for (int i = 0; i< counter; i++){
        cout << OldArray[i];
    }

    return 0;
}

我应该编写完全相同的代码,但不包括<string>标头。

所以,基本上,我必须写一个字符串作为char []并使字符串指针成为多个char[]的指针数组。

问题是,我不知道如何正确地做到这一点。

我通常会尝试这样做:

int counter = 0
char * charptr[500]; //this is gonna store adresses to some char[] 's 
char OurString[500]; //variable that will hold user's input
while(true){
    cin >> OurString;
    charptr[counter] = new char [500];
    charptr[counter] = OurString // mistake - charptr[counter] gets assigned physical adress of OutString while that's not exactly what we want
}

我将不得不使用某种函数从某些地址范围开始复制数据。任何想法如何这样做?

另外,请注意这个解决方案迫使我创建固定大小的char数组,而在使用字符串时,没有必要定义字符串的大小 - 不创建一个能够容纳500个字符的字符数组浪费内存比较串?如果是这样,那么在没有字符串类的C语言中问题是如何解决的?

c++ arrays allocation
2个回答
0
投票

做你想要的,尝试这样的事情:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char text[500];
    char ** OldArray = nullptr;
    char ** NewArray = nullptr;
    unsigned int counter = 0;
    size_t textlen;

    cout << "Enter Strings: " << endl;
    while (cin.get(text, 500, ' ')) {
        if (strstr(text, "End")) break;

        NewArray = new char*[counter+1];
        for(int i = 0; i < counter; ++i) {
            NewArray[i] = OldArray[i];
        }

        textlen = strlen(text) /* or: cin.gcount() */ + 1;
        NewArray[counter] = new char[textlen];
        strncpy(NewArray[counter], text, textlen);

        delete [] OldArray;
        OldArray = NewArray;

        ++counter;
    }

    for (int i = 0; i < counter; ++i) {
        cout << OldArray[i] << " ";
    }

    for (int i = 0; i < counter; ++i) {
        delete[] OldArray[i];
    }
    delete[] OldArray;

    return 0;
}

0
投票

我将不得不使用某种函数从某些地址范围开始复制数据。任何想法如何这样做?

C ++标准库有一个复制算法。它被称为std::copy。如果您不使用标准库,则可以使用循环,赋值运算符和指针算法实现相同的算法。

是不是创建了一个字符数组,与字符串相比,能够容纳500个字符浪费内存?

是。

如果是这样,那么在没有字符串类的C语言中问题是如何解决的?

std::string本身的实现方式类似;毕竟,std::string不能用于实施std::string。虽然std::string的底层数据结构可以在C和C ++中一起实现,但是获取和释放内存的方式有些不同,因为C没有类或异常。

字符串只是一系列对象的特例 - 它是一系列字符。有几个可调整大小的数据结构可以表示序列。例如,std::stringstd::vector使用称为“动态数组”的数据结构实现。

动态数组使用指针实现,指针指向动态分配的数组,指向该数组大小的记录,以及指向最后插入元素的指针(或者,元素数量)。如果分配的空间用完,则分配一个新的,更大的动态数组,复制旧数组中的内容,并释放旧数组。以几何速率增长阵列是很重要的,以便实现插入操作的恒定渐近复杂度(摊销)。

© www.soinside.com 2019 - 2024. All rights reserved.