【问题标题】:dynamically created arrays动态创建的数组
【发布时间】:2011-02-12 14:48:43
【问题描述】:

我的任务由两部分组成。首先,我必须创建 100 个元素的全局字符数组,并使用 cin 向其中插入一些文本。然后计算字符数量,并根据输入文本的长度创建专用数组。我正在考虑以下解决方案:

char[100]inputData;

int main()
{  

   cin >> inputData >> endl;

   int length=0;
   for(int i=0; i<100; i++)
   {
           while(inputData[i] == "\0")
           {
               ++count;
           }
   }
char c = new char[count];

我的想法好吗?

任务的第二部分是在第一个程序中引入动态创建的指向所有插入单词的指针数组。添加一个新单词应该打印所有之前的单词,如果没有空间用于下一个单词,则 inputData 数组的大小应该增加两倍。老实说,这对我来说有点过分了。我如何专门创建指向单词的指针?以及如何在不丢失其内容的情况下增加全局数组的大小?有一些临时数组?

【问题讨论】:

  • “我的任务由两部分组成。首先我必须创建 100 个元素的全局 char 数组” - 不,您几乎可以肯定不需要这样做。
  • @Tom:我当然希望如此——否则这完全是疯了(甚至作为家庭作业,这有点可疑)。
  • 我记得很多年前一位朋友的第一次 c++ 作业失败了。他应该声明 4 个变量,3 个第一个特定值和第 4 个 = 之前 3 个的总和。他只是声明了 1 个变量并分配了总的值,老师问他在想什么,他说‘如果我已经知道变量将始终由什么值初始化,让其他变量不是低效的?'
  • 这段代码甚至无法编译:char[100] inputData; 是无效的 C++ 代码。你想要char inputData[100];

标签: c++ arrays dynamic pointers allocation


【解决方案1】:

不管您的其他问题如何,您似乎对while 循环有一些不正确的想法。让我们看看这段代码。

for(int i=0; i<100; i++) {
    while(inputData[i] == "\0") {
        ++count;
    }
}

首先,"\0" 不是 NUL 字符。它是一个指向仅包含终止 NUL 字节的字符串的指针。你想要'\0'。假设这种变化,仍然存在问题。让我们来看看会发生什么:

  • while 循环如何工作?只要条件为真,它就会重复执行主体。
  • while 循环何时结束?当条件最终通过执行主体变为假时。
  • 您的循环条件如何? inputData[i] == '\0',修正后。
  • 身体是什么? ++count
  • ++count 可以更改条件的值吗?不,因为它不会改变 i
  • 因此,如果 inputData[i] 不是 NUL 字节,则 while 循环永远不会执行。
  • 但是,如果 inputData[i] 是 NUL 字节,则 while 循环将永远执行。
  • 假设您已将正确的字符串读入inputData,那么在某些时候inputData[i] 将是NUL,并且您将有一个无限循环。

要计算标准 C 字符串的长度,只需这样做

count = strlen(inputData);

如果出于某种原因你真的必须编写一个循环,那么以下工作:

int len = 0, 
while (inputData[len] != '\0') {
    len++;
}

循环之后,len 保存字符串的长度。

【讨论】:

    【解决方案2】:
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string input;
        std::getline(std::cin, input);
    }
    

    【讨论】:

      【解决方案3】:

      全局数组不能动态改变大小,除非它们是指向数组的指针,在这种情况下,您可以擦除它们并重新分配它们。

      也许您所追求的是一个自动调整大小的数组,例如 std::vector。可以通过对向量调用 size() 来查看数组中有多少个字母,也可以通过调用 resize() 来增加数组的大小。

      虽然不是最优雅的解决方案,但目前使用起来可能会更容易一些。

      【讨论】:

        猜你喜欢
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 2020-06-17
        • 2016-06-12
        • 2015-08-10
        • 1970-01-01
        相关资源
        最近更新 更多