我有以下代码:
#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语言中问题是如何解决的?
做你想要的,尝试这样的事情:
#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;
}
我将不得不使用某种函数从某些地址范围开始复制数据。任何想法如何这样做?
C ++标准库有一个复制算法。它被称为std::copy
。如果您不使用标准库,则可以使用循环,赋值运算符和指针算法实现相同的算法。
是不是创建了一个字符数组,与字符串相比,能够容纳500个字符浪费内存?
是。
如果是这样,那么在没有字符串类的C语言中问题是如何解决的?
与std::string
本身的实现方式类似;毕竟,std::string
不能用于实施std::string
。虽然std::string
的底层数据结构可以在C和C ++中一起实现,但是获取和释放内存的方式有些不同,因为C没有类或异常。
字符串只是一系列对象的特例 - 它是一系列字符。有几个可调整大小的数据结构可以表示序列。例如,std::string
和std::vector
使用称为“动态数组”的数据结构实现。
动态数组使用指针实现,指针指向动态分配的数组,指向该数组大小的记录,以及指向最后插入元素的指针(或者,元素数量)。如果分配的空间用完,则分配一个新的,更大的动态数组,复制旧数组中的内容,并释放旧数组。以几何速率增长阵列是很重要的,以便实现插入操作的恒定渐近复杂度(摊销)。