仍在学习 C++ 类(class)。
我们将讨论动态内存分配、C 字符串和指针。在当前的分配中,我们将使用指向 C 字符串的指针,并动态分配足够的内存来存储用户输入的所有字符以及必须附加在 C 字符串末尾的“\0”字符。
在我看到的示例中,首先询问用户输入的长度,然后使用该数字为输入分配内存。
示例(只是一个代码片段):
int main(){
double *sales = nullptr;
int count;
//User is first asked how long input will be.
cout << "For how many days do you want to enter sales? ";
cin >> numDays;
cout << endl;
sales = new double[numDays]; //numDays is now used to allot memory
...
return(0);
}
其他示例类似,首先询问用户内存分配应该有多长。然而,对于这个任务,我们只是要求用户直接输入 C 字符串。
我的问题是,如果我们必须将输入存储在 C 字符串数组中,我们必须用常量声明数组的大小,这意味着我们必须在编译时或多或少地知道我们需要多少空间,是的?这看起来很奇怪,因为动态内存分配的好处是“多少内存空间”是在运行时确定的,而不是编译时确定的。
int main()
{
const int SIZE = 10000;
char inputArray[SIZE];
char *inputPtr = nullptr;
int inputLength = 0;
cout << "Enter some stuff and I'll show you the vowels." << endl;
cin.getline(inputArray, SIZE - 1);
for (int i = 0; i < SIZE; i++)
{
if (inputArray[i] == '\0')
{
inputLength = i - 1;
}
}
inputPtr = new char[inputLength];
inputPtr = inputArray;
...
return(0);
}
在上面的代码中(我不确定是否正确分配了指针),我将用户输入捕获到一个可以容纳 9,999 个字符和“\0”的数组中。如果用户输入“hi”,那么内存中就会有 9,997 个空值,是吗?有没有一种方法可以捕获用户输入而不浪费空间?
此赋值的限制是我们不能使用字符串变量,只能使用 C 字符串。我们只能使用new
和delete
来动态分配内存。
最佳答案
在您展示的第一个代码示例中,您清楚地了解了动态内存分配的工作原理; new
运算符如何工作。
您的作业要求您“动态分配足够的内存来存储用户输入的所有字符加上‘\0’字符”。这就是您在问题中描述您的任务的方式。它不会要求您“将输入存储在固定大小的 C 字符串数组中”,这是您认为作业希望您执行的操作。
看来给你的任务很明确。您将使用 new char[size]
分配字符串,就像第一个示例中的 new double[size]
一样。同样的事情。
现在,当然,您事先并不知道输入字符串的大小。但是,希望在您拥有conversation with your rubber duck之后,您将向您的橡皮鸭解释您建议的方法,如下所示:
使用合理的大小为输入的字符串分配初始缓冲区。说 40 个字符。
开始读取用户输入,并将其保存到缓冲区中。
每次将缓冲区填充到最大大小时,您都会分配一个新的大缓冲区,将旧的已满缓冲区的内容复制到更大的新缓冲区,
删除
旧缓冲区,然后使用新的更大缓冲区继续读取用户输入。读完整个输入的文本并附加尾随“\0”后,最终得到的缓冲区将以您的文本字符串作为其内容。它可能会比实际输入的文本稍大,末尾有一些未使用的字节。有什么大不了的。现在 RAM 很便宜。
如果你的橡皮鸭同意你提议的行动方针,我想这个词已经给出:实现它。
关于c++ - 动态为 C 字符串分配内存,无需先询问用户输入有多长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762871/