Я пытаюсь найти файл подсчитывает нет.зарезервированных слов 'C', встречающихся с помощью бинарного поиска - PullRequest
0 голосов
/ 29 апреля 2019

Я пишу программу на языке c, которая ищет файлы исходного кода и подсчитывает количество встреченных зарезервированных слов.Но зарезервированное слово печатается, только если введенное зарезервированное слово является первым словом.И это подсчитывает общее количество строк, а не общее количество используемых зарезервированных слов.Может ли кто-нибудь помочь мне в этом.Мой код такой грязный, пожалуйста, не обращайте на это внимания.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define KEYMAX 32


FILE *fp ;
char data[1024];
struct keyword
{
    char word[10];
    int occur;
};
int i = 0, j = 0, pos;
char str[100], unit[20], ch;
int stored[1024];
char delimiters[] = " \t\n\v\f\r";  /* possible space delimiters */
char *token;
struct keyword key[32] = {"auto", 0, "break", 0, "case", 0,
                          "char", 0, "const", 0, "continue", 0,
                          "default", 0, "do", 0, "double", 0,
                          "else", 0, "enum", 0, "extern", 0,
                          "float", 0, "for", 0, "goto", 0,
                          "if", 0, "int", 0, "long", 0,
                          "register", 0, "return", 0, "short", 0,
                          "signed", 0, "sizeof", 0, "static", 0,
                          "struct", 0, "switch", 0, "typedef", 0,
                          "union", 0, "unsigned", 0, "void", 0,
                          "volatile", 0, "while", 0,};

int main()
{
    takeinput();
    system("CLS");
    theresult();
    // processresult();
    // ctoken();
return (0);

}

int takeinput()    // function to write in the file
{

  printf( "**********Welcome*************" ) ;
    fp = fopen("test.c", "w") ;   // Open file in write mode.
    if ( fp == NULL )
    {
        printf( "Could not open file test.c" ) ;  // Prints the statement if the file is not able to open.
        return 1;
    }
    printf( "\nPlease enter some text from keyboard to write in the file test.c \n\t" ) ;
    // getting input from user
    while ( strlen ( gets( data ) ) > 0 )
    {
        // writing in the file
        fputs(data, fp) ;           // Writes to file
        fputs("\n", fp) ;
    }

    // closing the file
    fclose(fp) ;
    return 0;
}

int theresult()
{

   fp = fopen("test.c", "r"); // read mode

   if (fp == NULL)
   {
      perror("Error while opening the file.\n");   // Prints the statement if the file is not able to open.
      return 1;
   }
   printf("The contents of test.c file are:\n");

 // To covert the ch into str
   int i= 0;
  //  printf("-----this is from ch----\n"); (Just for reference)
   while((ch = fgetc(fp)) != EOF)
   {
    str[i]=ch;
    i++;

   //  printf("%c",ch);   prints character

   }

   printf("%s",str);

   // printf("\n----This is from token-----\n");   (just for reference)
   for (token = strtok(str, delimiters); token != NULL;
         token = strtok(NULL, delimiters)) /* 'for loop' conditional part */
        /* prints token one per line */
       // puts(token);      // prints token

    for (i = 0; i < strlen(str); i++)
    {
        while (i < strlen(str) && str[i] != ' ' && isalpha(str[i]))
        {
            unit[j++] = tolower(str[i++]);
        }
        if (j != 0)
        {
            unit[j] = '\0';
            pos = binarysearch(unit, key);
            j = 0;
            if (pos != -1)
            {
               key[pos].occur++;
            }
        }
    }
    printf("***********************\n   Keyword\tCount\n***********************\n");
    for (i = 0; i < KEYMAX; i++)
    {
        if (key[i].occur)
        {
            printf("  %s\t  %d\n", key[i].word, key[i].occur);       // Prints the reserved keyword and its occurance
        }
    }

    fclose(fp);
   return (0);
}



int binarysearch(char *word, struct keyword key[])
{
    int low, high, mid;

    low = 0;
    high = KEYMAX - 1;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (strcmp(word, key[mid].word) < 0)
        {
            high = mid - 1;
        }
        else if (strcmp(word, key[mid].word) > 0)
        {
            low = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}

Введенная строка: если я сломаюсь, пожалуйста, присоединитесь снова.float float


Количество ключевых слов


if            1 
break     1
Float     2

1 Ответ

1 голос
/ 29 апреля 2019

Ошибка в функции theresult.В цикле for для токенизации ввода вы обрабатываете и ищете слово из всего ввода str вместо слова token, возвращаемого из strtok.Вам не нужно проверять пробел (' ') после токенизации, потому что пробел является частью разделителей.

Кажется, это работает для меня после изменения цикла на:

   for (token = strtok(str, delimiters); token != NULL;
         token = strtok(NULL, delimiters)) /* 'for loop' conditional part */
        /* prints token one per line */
       // puts(token);      // prints token

        for (i = 0; i < strlen(token); i++)
        {
            while (i < strlen(token) && token[i] != ' ' && isalpha(token[i]))
            {
                unit[j++] = tolower(token[i++]);
            }
            if (j != 0)
            {
                unit[j] = '\0';
                pos = binarysearch(unit, key);
                j = 0;
                if (pos != -1)
                {
                   key[pos].occur++;
                }
            }
        }

Вывод:

The contents of test.c file are:
if i break please re-join it. float float
***********************
   Keyword      Count
***********************
  break   1
  float   2
  if      1

Дополнительные замечания:

Вместо чтения всего входного файла в str я предлагаю читать и обрабатывать входные данные построчно, используяfgets и цикл.

Если вы хотите, чтобы пользователь вводил текст ввода, вы могли бы обработать строки ввода непосредственно, вместо того, чтобы сначала записать их в файл "test.c", а затем прочитать файл.

Цикл while после токенизации отрежет все от первого не альфа-символа.Возможно, вы реализовали это, потому что это не сработало из-за первоначальной ошибки.Когда токен "re-join", он будет искать "re".Вы должны проверить, хотите ли вы, и при необходимости изменить цикл while.

...