将字符串数组转换为 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::string
和 std::vector
是使用名为 "dynamic array".
的数据结构实现的
动态数组是使用指向动态分配数组的指针、该数组大小的记录以及指向最后插入的元素(或元素数量)的指针实现的。如果分配的 space 用完,将分配一个新的更大的动态数组,复制旧数组的内容,然后释放旧数组。以几何速率增长数组很重要,以便实现插入操作的恒定渐近复杂度(摊销)。
我有以下代码:
#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::string
和 std::vector
是使用名为 "dynamic array".
动态数组是使用指向动态分配数组的指针、该数组大小的记录以及指向最后插入的元素(或元素数量)的指针实现的。如果分配的 space 用完,将分配一个新的更大的动态数组,复制旧数组的内容,然后释放旧数组。以几何速率增长数组很重要,以便实现插入操作的恒定渐近复杂度(摊销)。