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

标签 c++ arrays memory c-strings

仍在学习 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 个字符。

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

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

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

如果你的橡皮鸭同意你提议的行动方针,我想这个词已经给出:实现它。

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

相关文章:

c++ - 按值类成员捕获

c++ - 使用 doxygen 分组 -> 到 uml 图的输出被复制

c++ - Boost.asio async_read_some编译错误

c++ - 运行时检查失败 #2 - 变量 'projectAverage' 周围的堆栈已损坏

javascript - 在更复杂的场景中合并localStorage(保存多个数组)

memory - 在Ubuntu中练习缓冲区溢出攻击

c++ - 在 64 位 Windows 上 long 的位大小是多少?

javascript - 更紧凑的方法来做到这一点?

c++ - 分配的值占用的空间超过类型的可用空间会怎样?

c - 将结构成员指针分配给另一个动态内存分配指针是否安全?