为 C 字符串动态分配内存,而无需先询问用户输入的长度
Dynamically allocate memory for C-string without first asking user how long input will be
仍在学习,使用 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 字符串数组中,我们必须用常量声明数组的大小,这意味着我们必须在编译时或多或少地知道多少 space 我们'需要,是吗?这看起来很奇怪,因为动态内存分配的好处是 'how much memory space' 是在 运行 时确定的,而不是编译时。
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] == '[=11=]')
{
inputLength = i - 1;
}
}
inputPtr = new char[inputLength];
inputPtr = inputArray;
...
return(0);
}
在我上面的代码中(我不确定我是否正确分配了指针),我将用户输入捕获到一个可以容纳 9,999 个字符和“\0”的数组中。如果用户键入 'hi',那么内存中就有 9,997 个空值,是吗?有没有一种方法可以在不浪费 space 的情况下捕获用户输入?
这个赋值的限制是我们不能使用字符串变量,只能使用 C 字符串。我们只能使用new
和delete
进行动态内存分配。
在您展示的第一个代码示例中,您清楚地了解了动态内存分配的工作原理; new
运算符的工作原理。
您的作业要求您 "dynamically allocate just enough memory to store all the characters entered by the user PLUS the ‘[=43=]’ char"。这就是您在问题中描述作业的方式。它不会要求您 "store the input in a C-string array" 固定大小,您认为作业要您做什么。
看来给你的任务已经很明确了。在第一个示例中,您将使用 new char[size]
分配字符串,就像 new double[size]
一样。一样的。
现在,当然,您事先不知道输入的字符串的大小。但是,希望在您 conversation with your rubber duck 之后,您将向您的橡皮鸭解释您提出的方法,如下所示:
使用合理的大小为输入的字符串分配初始缓冲区。说40个字。
开始读取用户输入,并将其保存到您的缓冲区中。
每次将缓冲区填充到最大大小时,您将分配一个新的大缓冲区,将旧的已满缓冲区的内容复制到更大的新缓冲区,delete
旧缓冲区,然后使用新的较大缓冲区继续读取用户输入。
在您阅读了整个输入的文本并附加了尾随的“\0”之后,您最终得到的最终缓冲区将以您的文本字符串作为其内容。它可能比实际输入的文本稍大,最后有一些未使用的字节。大不了。现在内存很便宜。
如果你的橡皮鸭同意你提议的行动方案,我想给出的词是:实施它。
仍在学习,使用 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 字符串数组中,我们必须用常量声明数组的大小,这意味着我们必须在编译时或多或少地知道多少 space 我们'需要,是吗?这看起来很奇怪,因为动态内存分配的好处是 'how much memory space' 是在 运行 时确定的,而不是编译时。
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] == '[=11=]')
{
inputLength = i - 1;
}
}
inputPtr = new char[inputLength];
inputPtr = inputArray;
...
return(0);
}
在我上面的代码中(我不确定我是否正确分配了指针),我将用户输入捕获到一个可以容纳 9,999 个字符和“\0”的数组中。如果用户键入 'hi',那么内存中就有 9,997 个空值,是吗?有没有一种方法可以在不浪费 space 的情况下捕获用户输入?
这个赋值的限制是我们不能使用字符串变量,只能使用 C 字符串。我们只能使用new
和delete
进行动态内存分配。
在您展示的第一个代码示例中,您清楚地了解了动态内存分配的工作原理; new
运算符的工作原理。
您的作业要求您 "dynamically allocate just enough memory to store all the characters entered by the user PLUS the ‘[=43=]’ char"。这就是您在问题中描述作业的方式。它不会要求您 "store the input in a C-string array" 固定大小,您认为作业要您做什么。
看来给你的任务已经很明确了。在第一个示例中,您将使用 new char[size]
分配字符串,就像 new double[size]
一样。一样的。
现在,当然,您事先不知道输入的字符串的大小。但是,希望在您 conversation with your rubber duck 之后,您将向您的橡皮鸭解释您提出的方法,如下所示:
使用合理的大小为输入的字符串分配初始缓冲区。说40个字。
开始读取用户输入,并将其保存到您的缓冲区中。
每次将缓冲区填充到最大大小时,您将分配一个新的大缓冲区,将旧的已满缓冲区的内容复制到更大的新缓冲区,
delete
旧缓冲区,然后使用新的较大缓冲区继续读取用户输入。在您阅读了整个输入的文本并附加了尾随的“\0”之后,您最终得到的最终缓冲区将以您的文本字符串作为其内容。它可能比实际输入的文本稍大,最后有一些未使用的字节。大不了。现在内存很便宜。
如果你的橡皮鸭同意你提议的行动方案,我想给出的词是:实施它。