2015-05-02 3 views
0

У меня есть программа, которую я пытаюсь получить, чтобы ввести строку, введенную пользователем, и найти количество вхождений букв и слов; функция поиска букв, похоже, работает нормально, но когда я отлаживаю и перехожу к функции поиска слов, я получаю экран, который ищет файл (который ранее был в списке, который не нужно искать, но я удалил его). Когда я пытаюсь открыть файл, я получаю сообщение об ошибке, которое не существует. Когда я не отлаживаю, я получаю сообщение о нарушении прав доступа.Почему я получаю ошибку нарушения прав доступа?

EDIT: Итак, у меня больше нет ошибки нарушения доступа, но мой вывод сумасшедший, всего лишь кучка символов.

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



int main() 
{ 
    char textStream[100]; //up to 98 characters and '\n\ and '\0' 
    void findLetters(char *ptr); 
    void findWords(char *point); 
    printf ("enter some text\n"); 
    if (fgets(textStream, sizeof (textStream), stdin)) //input up to 99 characters 
    { 
     findLetters(textStream); 
    } 
    else 
    { 
     printf ("fgets failed\n"); 
    } 
    findWords(textStream); 
    return 0; 
} 

void findLetters(char *ptr) //find occurences of all letters 
{ 
    int upLetters[26]; 
    int loLetters[26]; 
    int i; 
    int index; 

    for (i = 0; i < 26; i++) // set array to all zero 
    { 
     upLetters[i] = 0; 
     loLetters[i] = 0; 
    } 
    i = 0; 
    while (ptr[i] != '\0') // loop until prt[i] is '\0' 
    { 
     if (ptr[i] >= 'A' && ptr[i] <= 'Z') //stores occurrences of uppercase letters 
     { 
      index = ptr[i] - 'A';// subtract 'A' to get index 0-25 
      upLetters[index]++;//add one 
     } 

     if (ptr[i] >= 'a' && ptr[i] <= 'z') //stores occurrences of lowercase letters 
     { 
      index = ptr[i] - 'a';//subtract 'a' to get index 0-25 
      loLetters[index]++;//add one 
     } 
     i++;//next character in ptr 
    } 
    printf("Number of Occurrences of Uppercase letters\n\n"); 
    for (i = 0; i < 26; i++)//loop through 0 to 25 
    { 
     if (upLetters[i] > 0) 
     { 
      printf("%c : \t%d\n", (char)(i + 'A'), upLetters[i]); 
      // add 'A' to go from an index back to a character 
     } 
     printf("\n"); 
    } 
    printf("Number of Occurrences of Lowercase letters\n\n"); 
    for (i = 0; i < 26; i++) 
    { 
     if (loLetters[i] > 0) 
     { 
      printf("%c : \t%d\n", (char)(i + 'a'), loLetters[i]); 
      // add 'a' to go back from an index to a character 
     } 
    } 
} 

void findWords(char *point) 
{ 
    int i, k, count = 0; 
    int j, space = 0; 
    int c = 0; 
    char word[50][100], word1[50][100]; 

    for (i = 0;i<strlen(point);i++) //counts # of spaces between words 
    { 
     if ((point[i] == ' ')||(point[i] == ', ')||(point[i] == '.')) 
     { 
      space++; 
     } 
    } 

    for(;i < strlen(point); i++) //seperates strings from each other 
    { 
     if(point[i] == '.' || point[i] == 44|| point[i] == 46) 
     { 
      word[j][k] = '\0'; 
      j++; 
      k = 0; 
     } 
     else 
     { 
      word[j][k++] = point[i]; 
     } 
    } 
    k = 0; 
    for (i = 0;i <= space;i++) 
    { 
     for (j = 0;j <= space;j++) 
     { 
      if (i == j) // finds occurrences of words 
      { 
       strcpy(word1[k], word[i]); //copies words in new array 
       k++; 
       count++; 
      } 
      else if(strcmp(word1[j], word[i]) != 0) //makes sure that the word copied equals the word from the string 
      { 
       ; 
      } 
     } 
    } 
    j = 0; 
    i = 0; 
    for (;i < count ;i++) 
    { 
     for (;j <= space;j++) 
     { 
      if (strcmp(word1[i], word[j]) == 0) //counts occurrence of each word (Error occurs right here for the access violation) 
      { 
       c++; 
      } 
     } 
     printf("%s \t %d times\n", word1[i], c); 
     c = 0; 
    } 
} 
+0

Можете ли вы дать некоторые сведения о выходе отладчика? – ace

+1

Fyi '(point [i] == ',')' (обратите внимание на пробел * после * запятой и до заключительной одинарной кавычки)? Этот литерал, вероятно, действителен для вашей реализации, но также имеет значение 11296, которое подписанный октет будет * никогда. так что условие условия всегда будет ложным. И вы никогда не инициализируете 'j', прежде чем использовать его в своей функции. И .. вы, кажется, не прекращаете свои строки – WhozCraig

+1

, размещайте прототипы вне любой функции, например, сразу после операторов #include, поэтому компилятор будет знать, как скомпилировать указанные функции, и не будет использовать типы по умолчанию для возврата тип, а также типы параметров – user3629249

ответ

2

j и k используются неинициализированным в findWords(). Вы должны включить предупреждения компилятора, чтобы поймать простые ошибки, подобные этим. Используйте gcc -Wall -Wextra -Werror.

+0

переменная 'k' также используется перед установкой. – user3629249

+0

И причина, по которой он работает в режиме отладки, заключается в том, что компилятор должен обнулять локальные переменные, где это не делается в финальной сборке. +1 для «включения предупреждений». – usr2564301

Смежные вопросы