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

Converting array of strings to char multiple char * []

我有以下代码:

#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> header.

所以,基本上,我必须将字符串写成 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
}

我将不得不使用某种函数从某个地址范围开始复制数据。任何想法如何以这种方式做到这一点?

此外,请注意,此解决方案强制我创建固定大小的字符数组,而在使用字符串时,无需定义字符串的大小 - 不是创建能够容纳 500 个字符的字符数组与字符串相比浪费内存?如果是,C语言中没有字符串class的问题是怎么解决的?

按照你的要求去做,试试这样的事情:

#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;
}

I would have to use some kind of function to copy data starting from some range of addresses. Any ideas how to do it this way?

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

isn't creating an array of chars capable of holding 500 characters a waste of memory comparing to string?

是的。

If so, how is the problem solved in C language where there's no string class?

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

字符串只是对象序列的特例 - 它是字符序列。有几种可调整大小的数据结构可以表示一个序列。例如 std::stringstd::vector 是使用名为 "dynamic array".

的数据结构实现的

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