Как сохранить STDIN из текстового файла - PullRequest
0 голосов
/ 27 октября 2019

Мне нужно прочитать слова из текстового файла, а затем подсчитать вхождения каждого слова, но я не могу понять, как сохранить слова в переменной.

Я читаю код с использованием fgets, а затем я могу распечатать его с помощью printf. Однако, когда я пытаюсь сохранить массив символов в другом массиве, который я могу использовать для сравнения массивов символов позже, я продолжаю получать ошибки сегмента. Как я могу сохранить массив символов "line" в другом массиве?

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

#define MAXSIZE  500    
#define MAXWORDS 1000 


int main ( int argc, char *argv[] ) {
   char line[MAXSIZE];
   char line1[MAXWORDS][MAXSIZE];
   int i,j,k;
   int count = 0;


   while ( fgets ( line, MAXSIZE, stdin ) != NULL ) {
    printf("%s", line);


    strcpy(line1[count], line);

    printf("%s\n", line1[count][i]);


    count++;

   }

   return(0);
}

(Это мой обновленный код, он по-прежнему печатает первую строку, а затем вызывает ошибки.)

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

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Ваш strcpy работает должным образом, но printf вызвал предупреждение уже во время компиляции, измените строку printf с printf("%s\n", line1[count]); на printf("%s\n", line1[count]);

После цикла whileВы можете проверить свою копию с помощью:

for (int i=0; i < count; i++){
    printf("%d: %s",i, line[i]);
}

Хотя fgets поместит завершающий 0 -байт в конец буфера, он будет более защищенным для пользователя strncpy, который гарантированно не будеткопировать больше, чем n-байтов, но в этом примере вы можете полностью удалить копию, записав непосредственно в буфер line[count].

Также вы должны позаботиться и прекратить чтение перед перезаписью ваших буферов. Когда вы звоните fgets, вы ограничиваете чтение до MAXSIZE, что хорошо, но вы должны также проверить количество ниже MAXWORDS

0 голосов
/ 27 октября 2019

Возможно, код вопроса близок.

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

  #define MAXSIZE  500
  #define MAXWORDS 1000

  int main(int argc, char *argv[])
    {
    char line[MAXSIZE];
    char line1[MAXWORDS][MAXSIZE];
    int  count = 0;

    while(fgets(line, MAXSIZE, stdin))
      {
      printf("%s", line);
      strcpy(line1[count], line);
      printf("%s\n", line1[count]);  // instead of: printf("%s\n", line1[count][i]);

      count++;
      }

    return(0);
    }
...