Чтение файла слово за словом - PullRequest
0 голосов
/ 03 мая 2018

Я не знаю почему, но мой код печатает список (null) (null) (null) .... Я должен напечатать список слов из файла 'words.txt'. Другой вопрос: fscanf игнорировать пробелы?

#define WORD_LENGTH 1024
#define SIZE_QUOTE 100

int main(){
  char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
  long i;
  for(i = 0; i < SIZE_QUOTE; i++){
    if(!(malloc(sizeof(char) * (size_t)WORD_LENGTH)))
      exit(1);
  }
  i = 0;
  FILE *pf = fopen("words.txt", "r");
  while(!feof(pf) && i < SIZE_QUOTE){
    fscanf(pf, "%s", quote[i]);
    printf("%s", quote[i]);
    i++;
  }
  fclose(pf);
  free(quote);
}

1 Ответ

0 голосов
/ 04 мая 2018

Вы никогда не назначаете возвращаемое значение malloc() для quote[i], поэтому они останутся NULL (если вам повезет):

  char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
  long i;
  for(i = 0; i < SIZE_QUOTE; i++){
    if(!(malloc(sizeof(char) * WORD_LENGTH)))

Вместо этого должно быть что-то вроде этого:

  char **quote = malloc(sizeof(char*) * (size_t)SIZE_QUOTE);
  for(int i = 0; i < SIZE_QUOTE; i++){
    quote[i] = malloc(sizeof(char) * WORD_LENGTH);
    if(!quote[i])

Также вы можете избежать malloc() полной и статической инициализации этого массива, если известны все размеры:

char quote[SIZE_QUOTE][WORD_LENGTH] = {{'\0'}};

Кроме того, вы должны быть free() -инженер quote[i] в конце:

for(int i = 0; i < SIZE_QUOTE; ++i) free(quote[i]);
free(quote);

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

...