У меня есть программа, которую я пытаюсь получить, чтобы ввести строку, введенную пользователем, и найти количество вхождений букв и слов; функция поиска букв, похоже, работает нормально, но когда я отлаживаю и перехожу к функции поиска слов, я получаю экран, который ищет файл (который ранее был в списке, который не нужно искать, но я удалил его). Когда я пытаюсь открыть файл, я получаю сообщение об ошибке, которое не существует. Когда я не отлаживаю, я получаю сообщение о нарушении прав доступа.Почему я получаю ошибку нарушения прав доступа?
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;
}
}
Можете ли вы дать некоторые сведения о выходе отладчика? – ace
Fyi '(point [i] == ',')' (обратите внимание на пробел * после * запятой и до заключительной одинарной кавычки)? Этот литерал, вероятно, действителен для вашей реализации, но также имеет значение 11296, которое подписанный октет будет * никогда. так что условие условия всегда будет ложным. И вы никогда не инициализируете 'j', прежде чем использовать его в своей функции. И .. вы, кажется, не прекращаете свои строки – WhozCraig
, размещайте прототипы вне любой функции, например, сразу после операторов #include, поэтому компилятор будет знать, как скомпилировать указанные функции, и не будет использовать типы по умолчанию для возврата тип, а также типы параметров – user3629249