Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.63 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. typedef struct {
  7.     const char* text;
  8.     unsigned    text_len;
  9.     unsigned    text_pos;
  10.  
  11.     const char* token;
  12.     unsigned    token_len;
  13. } lexer_t;
  14.  
  15. bool lexer_next_token(lexer_t* self)
  16. {
  17.     unsigned i;
  18.     unsigned len;
  19.     char     ch;
  20.    
  21.     for(i = self->text_pos, len = 0;
  22.         i != self->text_len;
  23.         i++, len++) {
  24.         start:
  25.  
  26.         ch = self->text[i];
  27.        
  28.         if((ch < 'A' || ch > 'Z') &&
  29.            (ch < 'a' || ch > 'z')) {
  30.  
  31.             if(len == 0) {
  32.                 if(ch != ' ') {
  33.                     self->token = &self->text[i];
  34.                     self->token_len = 1;
  35.                     self->text_pos = i + 1;
  36.                     return true;
  37.                 } else {
  38.                     len = 0;
  39.                     i++;
  40.                     goto start;
  41.                 }
  42.             }
  43.            
  44.             self->token = &self->text[i-len];
  45.             self->token_len = len;
  46.             self->text_pos = i;
  47.             return true;
  48.            
  49.         }
  50.     }
  51.  
  52.     if(len) {
  53.         self->token = &self->text[i-len];
  54.         self->token_len = len;
  55.         self->text_pos = i;
  56.         return true;
  57.     }
  58.  
  59.     return false;
  60. }
  61.  
  62. int main(int argc, char* argv[])
  63. {
  64.     FILE*   file;
  65.     size_t  file_size;
  66.     char*   file_data;
  67.     int     cnt_word = 0, cnt_point = 0;
  68.     lexer_t lexer = {0};
  69.  
  70.  
  71.  
  72.     file = fopen("data","r");
  73.     fseek(file,0,SEEK_END);
  74.     file_size = ftell(file);
  75.     fseek(file,0,SEEK_SET);
  76.    
  77.     file_data = malloc(file_size);
  78.     fread(file_data,file_size,1,file);
  79.     fclose(file);
  80.  
  81.     lexer.text_pos = 0;
  82.     lexer.text = file_data;
  83.     lexer.text_len = file_size-1;
  84.  
  85.     while(lexer_next_token(&lexer)) {
  86.         if(lexer.token_len == 1 && lexer.token[0] == ',')
  87.             cnt_point++;
  88.         else
  89.             cnt_word++;
  90.     }
  91.    
  92.     printf("Итого: %d слов и %d запятых\n",cnt_word,cnt_point);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement