Почему fgets () не читает после первого элемента? - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь сделать этот проект программирования в книге, которую я изучаю:

Напишите программу, которая сортирует серии слов, введенных пользователем:

Введите слово: foo

Введите слово: bar

Введите слово: baz

Введите слово: quux

Введите слово:

В отсортированном порядке: bar baz foo quux

Предположим, что каждое слово содержит не более 20 символов. Прекратите чтение, когда пользователь вводит пустое слово (т. Е. Нажимает Enter, не вводя слово). Сохраните каждое слово в динамически распределенной строке, используя массив указателей для отслеживания строк.

После прочтения всех слов отсортируйте массив (используя любую технику сортировки), а затем используйте al oop печатать слова в отсортированном порядке.

Вот что я пытаюсь:

#include <stdio.h>
#include <string.h>

#define MAX_LENGTH 20

int compare ( const void * p, const void * q);

int main (void){
    int n;
    printf("How many words do you want to write");
    scanf("%d", &n);
    fflush(stdin);
    char * word[n];

    for( int i = 0; i < n; i++){
        fprintf(stdout , "Waiting for the word:");
       if(fgets(word[i] , MAX_LENGTH +1 , stdin) == "\n")
       break;
    }
    qsort((void *)word,n,sizeof(int),compare);

    printf("Ordered list is:\n\n");
    for( int i = 0; i < n; i++){
        fprintf(stdout , "\t %s", word[i]);
    }

}

int compare (const void * p, const void * q){
    return strcmp( * (char**) p , * (char **) q);
}

Редактировать: вопрос с itali c решен благодаря коллегам-кодировщикам здесь. Моя новая проблема - я не могу прочитать после первого элемента массива. И программа закрывается сама.

C:\Users\Lenovo\Desktop\ogrenme\ch17>sorting
How many words do you want to write4
Waiting for the word:asd

C:\Users\Lenovo\Desktop\ogrenme\ch17>

И есть одна раздражающая ошибка, которая не дает мне завершить упражнение и «расслабиться» с остальной частью этой сложной книги:

sorting.c:20:5: warning: implicit declaration of function 'qsort' [-Wimplicit-function-declaration]
    qsort((void *)word,n,sizeof(int),compare);

1 Ответ

1 голос
/ 26 марта 2020

Я провел небольшую пробную версию (определенно код можно оптимизировать)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (void) {
  int n = 0;
  char **string_list;
  char *tmp;

  //allocate memory for the first element
  string_list = (char**)malloc(sizeof(char*)*1);

  //infinite loop
  while ( 1 ) {
    //allocate size of each element to a max of 20 chars
    string_list[n] = (char*)malloc(sizeof(char)*20);

    printf("Enter word : ");
    fgets (string_list[n], 20, stdin);

    //remove trailing return carriage
    string_list[n][strlen(string_list[n]) - 1] = '\0';

    //break the loop here if user enters empty string
    if (strlen(string_list[n]) < 1) {
      break;
    }

    //add counter
    n++;

    //add memory to contain another element
    string_list = realloc(string_list, sizeof(char*)*(n+1));
  }

  printf("\n\nInitial List is:\n");
  for (int i=0 ; i<n-1 ; i++) {
    printf("%s - ", string_list[i]);
  }
  printf("%s\n\n", string_list[n-1]);

  //sorting the list
  for (int i=0; i<n; i++) {
    for (int j=0; j<n; j++) {
      if (strcmp(string_list[i], string_list[j]) < 0) {
        tmp = string_list[i];
        string_list[i] = string_list[j];
        string_list[j] = tmp;
      }
    }
  }

  printf("Sorted List is:\n");
  for (int i=0 ; i<n-1 ; i++) {
    printf("%s - ", string_list[i], strlen(string_list[i]));
  }
  printf("%s\n\n", string_list[n-1], strlen(string_list[n-1]));
}

вывод

$ ./sort 
Enter word : foo
Enter word : bar
Enter word : baz
Enter word : quux
Enter word : 


Initial List is:
foo - bar - baz - quux

Sorted List is:
bar - baz - foo - quux
...