Считать слова в файле? - PullRequest
       2

Считать слова в файле?

0 голосов
/ 23 ноября 2010

У меня есть программа, написанная на C, которая должна подсчитывать, сколько раз слово «the» появляется в текстовых файлах, которые приводятся в качестве аргументов. Но программа продолжает выдавать ошибку ошибки сегментации, и у меня нет больше идей о том, какрешить эту проблему. Любая помощь будет оценена. Спасибо!

Вот код:


#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[])
{ 
  int h,i;
  FILE *fp;
  char* mess;
  for(i=1; i < argc; i++)
  { 
     h=0;
     fp=fopen(argv[i],"r");
      while (!feof(fp))
      { 
        fscanf(fp,"%s",mess);
        if (strcmp(mess,"the")==0)
          h++;
      }
      printf("The file %s contains the word \"the\" %d times.",argv[i],h);
      h=0; 
      fclose(fp);
  }
}

Ответы [ 7 ]

5 голосов
/ 23 ноября 2010
 char* mess;
 [...]
       fscanf(fp,"%s",mess);

беспорядок не инициализирован.Вам нужно выделить место для слова, которое вы читаете, в

s Соответствует последовательности символов, не являющихся пробелами;следующий указатель должен быть указателем на тип char, а массив должен быть достаточно большим, чтобы принять всю последовательность и завершающий символ NUL.Входная строка останавливается на пустом месте или на максимальной ширине поля, в зависимости от того, что произойдет раньше.

, поэтому вы также хотите использовать ширину поля, чтобы ограничить то, что вы читаете, размером буфера.Это требует некоторой осторожной обработки, так как бит после размера буфера может быть просто «the» (например, «дышать», если вы прочитаете 4-символьные слова, даст вам «brea» и «the» и ложное срабатывание)

1 голос
/ 23 ноября 2010

char* mess - это унифицированный указатель. Другими словами: это переменная, значением которой является случайный адрес в памяти. При вашем звонке на fscanf будет сделана попытка что-то написать по этому адресу, и ваша программа потерпит крах.

Либо сделайте mess массивом фиксированного размера, либо сделайте так, чтобы он указывал на действительный блок памяти, который был динамически выделен с использованием malloc (что, вероятно, здесь бесполезно) В обоих случаях вам, вероятно, захочется убедиться, что вы не можете прочитать больше, чем size символ, иначе вы получите совершенно новую ошибку сегментации.

0 голосов
/ 23 ноября 2010

выделить память для беспорядка, используя либо mess=malloc(sizeof(char)*SOME_NUMBER), либо просто объявив беспорядок в виде массива символов, то есть символ беспорядка [1024];

0 голосов
/ 23 ноября 2010

Насколько я могу прочитать из кода, вы не инициализировали указатель mess до того, как использовали его для заполнения fscanf:

fscanf(fp,"%s",mess);
0 голосов
/ 23 ноября 2010
while (!feof(fp))
{ 
  fscanf(fp,"%s",mess);
  if (strcmp(mess,"the")==0)
  h++;
}

Вы читаете строку из файла, помещая ее в mess, который является простым указателем на символ.Вам нужен массив символов:

char mess[1000];
0 голосов
/ 23 ноября 2010

Вам необходимо выделить память для буфера mess, передаваемого sscanf:

char mess[256];

В настоящее время mess неинициализирован (пусто).sscanf спотыкается, пытаясь написать в него.

0 голосов
/ 23 ноября 2010

fscanf(fp,"%s",mess); не выделит память!

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