ошибка сегментации с помощью программы - PullRequest
0 голосов
/ 02 марта 2019

Программа получает данные из текстового файла, затем анализирует их по пробелам и затем сохраняет их в массиве.Я использую «<» в Linux для чтения в файле. Мне нужно было создать динамически распределенный массив для хранения слов </p>

, если входные строки «Я кот в шляпе», томассив должен выглядеть следующим образом: index:

   "I" "am" "the" "cat" "in" "the" "hat" 
    0    1    2     3     4    5     6

Я получаю ошибку сегментации и не могу понять, почему я получаю ошибку?Мне нужно, чтобы любая помощь была бы оценена.

код:

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

int main()
{

int wordCount = 1, i;
char ch,* wordsArray;

while((ch = getc(stdin)) != EOF)
    {
      if(ch == ' ') {++wordCount;}
    }

    wordsArray =(char*)malloc(wordCount * sizeof(char));

    for(i = 0; i<wordCount; i++)
     {
        scanf("%s",&wordsArray[i]);
        printf("%s\n", wordsArray[i])
     }
  return 0;
}

Редактировать: Я разместил фактический код.Я больше не получаю падения сегментации, но слова не попадают в массив.

пример вывода:

 a.out<dict.txt
(null)
(null)
(null)
(null)
(null)
(null)
(null)

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

То, что вы пытаетесь выполнить, - это анализ стандартного ввода.Вам могут помочь некоторые функции, такие как strtok () и strsep () .

. Вам понадобится входной буфер, который вы можете размещать или использоватьмассив (я бы использовал массив).Когда функции разбирают входную строку, вы можете сбросить адреса слов в массив указателей char .Вы также можете создать связанный список.

Наконец, вы должны буферизовать ввод, что добавляет сложности операции.Тем не менее, ничего хорошего программист на Си не может справиться.Веселитесь.

0 голосов
/ 02 марта 2019

Вкратце, вы просите scanf сканировать строки в пространство памяти, которое вы выделите достаточно большим для нескольких целых чисел.Обратите внимание, что вашему вызову malloc присваивается количество целых чисел, а затем вы присваиваете его char *.Эти две вещи не смешиваются, и происходит то, что вы сканируете кучу байтов в вашем буфере, который слишком мал, запускается до конца, топает чем-то другим, а затем вылетает.Компилятор позволяет вам избежать неприятностей с этим, потому что и malloc, и scanf предназначены для работы с различными типами (void*), поэтому компилятор не знает, как обеспечить согласованность типов в этом случае.

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

Но если ваша цель - просто создать желаемый результат, на самом деле есть более простые способы сделать это, например, использовать strtok или просто проходить по входному символу с помощью char и отслеживать, где вы нажимаете пробелы и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...