Хранение строк в массиве указателей из другой строки - PullRequest
0 голосов
/ 25 июня 2018

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

#include <stdio.h>
#include <string.h>
#define LINES 5
void main()
{
   char c;
   char* str1 = (char*)malloc(30);
   char* str[LINES];
   int i = 0,temp;
   while ((c = getchar()) != EOF) //storing all characters from input stream into an array
      *(str1 + i++) = c;
   *(str1 + i) = '\0';
   temp = i;//total number of characters
   i = 0;
   int j = 0, k = 0;
   str[j] = (char*)malloc(30);
   while (i < temp)//storing each line in separate pointers of the array of pointers
   {
      if (j + 1 == LINES)
         break;
      if (*(str1 + i) == '\n')
      {
         *(*(str + k) + j++) = '\0';
         str[j] = (char*) malloc(30);
         k = 0;
      }
      else
         *(*(str + k++) + j) = *(str1 + i);
      i++;
   }
   printf("%s\n", str[0]);//printing the first line

}

Вот как выглядит мой экран вывода:

iiii
iii
ii
i
i
^Z
Press any key to continue . . .

На экране ввода после ввода и ввода EOF программа завершается сбоем.Почему он не работает?

кстати он вылетает после EOF.

1 Ответ

0 голосов
/ 25 июня 2018

Проблема в том, что вы поменяли местами индексы j и k.

*(*(str + k++) + j) = *(str1 + i);
*(*(str + k) + j++) = '\0';

эквивалентно:

str[k++][j] = str1[i];
str[k][j++] = '\0';

и это не то, что вы хотите сделать. То, что вы хотите:

str[j][k++] = str1[i]; /* *(*(str + j) + k++) = *(str1 + i); */
str[j++][k] = '\0';    /* *(*(str + j++) + k) = '\0';        */

Другие комментарии (некоторые из них по комментариям к вашему вопросу):

  1. void main() должно быть int main(void)
  2. Компиляция с использованием -Wall -Wextra, особенно если вы изучаете
  3. ваш первый while является for:

    for (i = 0; (c = getchar()) != EOF) && i < temp-1; i++)
        *(str + i) = c;
    

    или

    for (i = 0; (str[i] = getchar()) != EOF) && i < temp-1; i++)
        ;
    
  4. Ваш второй while также for: for (i = 0, j = 0, k = 0; i < temp && j < LINES; i++)

  5. вы пропустите последнюю строку, из-за этого j + 1 == LINES.
  6. Если вы не практикуете указатели, не делайте этого *(*(str + k++) + j); даже если вы практикуете указатели, не делайте этого, поскольку вы можете практиковать доступ с помощью указателя, а не индекса с обозначением указателя.
  7. прочитав string.h документацию, вы найдете множество функций, облегчающих вашу жизнь: fgets, strchr, strdup и т. Д.
...