gpt4 book ai didi

c++ - 为 C 字符串动态分配内存,而无需先询问用户输入的长度

转载 作者:行者123 更新时间:2023-11-30 05:30:51 27 4
gpt4 key购买 nike

仍在学习,在 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 字符串。我们只能使用newdelete进行动态内存分配。

最佳答案

在您展示的第一个代码示例中,您清楚地了解了动态内存分配的工作原理; new 运算符的工作原理。

你的作业要求你“动态分配足够的内存来存储用户输入的所有字符加上‘\0’字符”。这就是您在问题中描述作业的方式。它不会要求您将固定大小的“输入存储在 C 字符串数组中”,即您认为作业要您执行的操作。

看来你的任务很明确。在您的第一个示例中,您将使用 new char[size] 分配您的字符串,就像 new double[size] 一样。同样的事情。

现在,当然,您事先不知道输入字符串的大小。但是,希望在您拥有 conversation with your rubber duck 之后,您将向您的橡皮鸭解释您提出的方法,如下所示:

  • 使用合理的大小为输入的字符串分配初始缓冲区。说 40 个字符。

  • 开始读取用户输入,并将其保存到您的缓冲区中。

  • 每次将缓冲区填充到最大大小时,您将分配一个新的大缓冲区,将旧的已满缓冲区的内容复制到更大的新缓冲区,delete 旧缓冲区,然后使用更大的新缓冲区继续读取用户输入。

  • 在您读取整个输入的文本并附加尾随的“\0”之后,您最终得到的最终缓冲区将以您的文本字符串作为其内容。它可能比实际输入的文本稍大,最后有一些未使用的字节。大不了。现在 RAM 很便宜。

如果你的橡皮鸭同意你提议的行动方案,我猜已经给出了一个词:实现它。

关于c++ - 为 C 字符串动态分配内存,而无需先询问用户输入的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com