Ошибка сегментации при чтении случайных строк текста? - PullRequest
0 голосов
/ 13 апреля 2020

Я прочитал много документации по этому вопросу, но у меня все еще есть некоторые проблемы по этому поводу, я знаю, что такое указатель, но когда я пытаюсь использовать, я сталкиваюсь с какой-то проблемой, в приведенном ниже коде txt-файл включает в себя только одно слово на каждый line.I попытался прочитать случайную строку из текста и вернуться к основной функции после того, как мне понадобится это). И я распечатаю его в основной функции, пожалуйста, можете ли вы помочь мне, какой раздел я должен изменить в этом коде? (Когда я пытаюсь запустить это сообщение об ошибке Сегментация сбой (ядро сброшено))

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

char word(char *file, char str[], int i);

int main() {
  char buf[512];

  char j = word("words.txt", buf, 512);
  puts(j); // print random num
}

char word(char *file, char str[], int i) {
  int end, loop, line;

  FILE *fd = fopen(file, "r");
  if (fd == NULL) {
    printf("Failed to open file\n");
    return -1;
  }

  srand(time(NULL));
  line = rand() % 100 + 1; // take random num

  for (end = loop = 0; loop < line; ++loop) {
    if (0 == fgets(str, sizeof(str), fd)) { // assign text within a random line to STR
      end = 1;
      break;
    }
  }
  if (!end)
    return (char*)str; // return the str pointer
  fclose(fd);
}

1 Ответ

0 голосов
/ 14 апреля 2020

Вы снова открыли файл, это может быть так. Вы не закрываете файл, если он возвращается, если (! End) часть fd не закрыта. И функция принимает символ, но на самом деле нужен символ *

char word(char *file, char str, int i);

int main() {
  char * buf = malloc(sizeof(char)*512);
  char *words = "words.txt";
  char* j = word(words, buf, 512);
  puts(j); // print random num
}

char word(char *file, char str[], int i) { // FIX HERE
  int end, loop, line;

  FILE *fd = fopen(file, "r"); // 
  if (fd == NULL) {
    printf("Failed to open file\n");
    return -1;
  }

  srand(time(NULL));
  line = rand() % 100 + 1; // take random num

  for (end = loop = 0; loop < line; ++loop) {
    if (0 == fgets(str, sizeof(str), fd)) { // MAIN PROBLEM, PUT A CHAR* TO STR. 
      end = 1;
      break;
    }
  }
fclose(fd); // YOU DIDN'T CLOSE IF IT RETURNED BEFORE
  if (!end)
    return str; // return the str pointer

//NOTHING IS RETURNED HERE
return str;
// I guess the problem is here, you return nothing and the function finishes, and you try to write that nothing with puts function which may cause a seg fault.
}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...