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

时间:2019-03-13 20:29:09

标签: c++ arrays allocation

我有以下代码:

.map_async()

我应该编写完全相同的代码,但不包括#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[]

我将不得不使用某种功能来复制从某个地址范围开始的数据。有什么想法怎么做的吗?

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

  

我将不得不使用某种功能来复制从某个地址范围开始的数据。有什么想法怎么做的吗?

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

  

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

是的

  

如果是这样,在没有字符串类的情况下,如何用C语言解决问题?

std::string本身的实现方式类似;毕竟,std::string无法用于实现std::string。尽管std::string的基本数据结构可以在C中以及在C ++中实现,但是由于C没有类或异常,因此获取和释放内存的方式有所不同。

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

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