Хранение текста в матрице символов в C - PullRequest
1 голос
/ 19 августа 2011

Я хочу взять текст из стандартного ввода и сохранить его в массив строк. Но я хочу, чтобы массив строк был динамическим в памяти. Мой код сейчас выглядит следующим образом:

char** readStandard()
{
  int size = 0;
  char** textMatrix = (char**)malloc(size);
  int index = 0;
  char* currentString = (char*)malloc(10); //10 is the maximum char per string
  while(fgets(currentString, 10, stdin) > 0)
    {
      size += 10;
      textMatrix = (char**)realloc(textMatrix, size);
      textMatrix[index] = currentString;
      index++;
    }
  return textMatrix;
}

Результат, полученный при печати, - последняя строка, прочитанная во всех позициях массива.

Пример Чтение: Привет отлично в встретить Вы

Печать: вы вы вы вы Вы

Почему? Я искал через Интернет. Но я не нашел такой ошибки.

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

Вы сохраняете один и тот же адрес (currentString) снова и снова.Попробуйте что-то вроде

while(fgets(currentString, 10, stdin) > 0)
{
     textMatrix[index] = strdup(currentString); /* Make copy, assign that. */
}

Функция strdup не является стандартной (просто широко доступна).Это должно быть легко реализовать самостоятельно с помощью malloc + memcpy.

2 голосов
/ 19 августа 2011

currentString всегда указывают на одну и ту же область памяти, и все указатели в textMatrix будут указывать на нее

char** readStandard()
{
  int size = 0;
  char** textMatrix = (char**)malloc(size);
  int index = 0;
  char currentString[10];
  while(fgets(currentString, 10, stdin) > 0)
    {
      size += sizeof(char*);
      textMatrix = (char**)realloc(textMatrix, size);
      textMatrix[index] = strdup(currentString);
      index++;
    }
  return textMatrix;
}
...