динамически создаваемые массивы - PullRequest
0 голосов
/ 27 апреля 2010

Моя задача состоит из двух частей. Сначала я должен создать глобальный массив символов из 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 следует увеличить в два раза. И, честно говоря, это слишком много для меня. Как я могу создавать указатели на слова конкретно? И как я могу увеличить размер глобального массива без потери его содержимого? С каким временным массивом?

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

Независимо от остальной части вашего вопроса, у вас, кажется, есть некоторые неверные представления о 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 содержит длину строки.

1 голос
/ 27 апреля 2010
#include <iostream>
#include <string>

int main()
{
    std::string input;
    std::getline(std::cin, input);
}
0 голосов
/ 27 апреля 2010

Глобальные массивы не могут динамически изменяться в размере, если они не являются указателями на массив, в этом случае вы можете стереть их и перераспределить их.

Возможно, вам нужен автоматически изменяемый размер массива, например, std :: vector. Вы можете увидеть, сколько букв у вас в массиве, вызвав size () для вектора, и вы можете увеличить размер массива, вызвав resize ().

Хотя это и не самое элегантное решение, на данный момент его может быть немного проще.

...