Advertisement
gguuppyy

1LabKT

Sep 17th, 2024 (edited)
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.27 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <ctype.h>
  3. #include <stdbool.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8.  
  9. enum charType {
  10.     ctError,
  11.     ctDollar,
  12.     ctZero,
  13.     ctXLetter,
  14.     ctDigit,
  15.     ctLetter
  16. };
  17.  
  18. const int CURRENT_STATE[6][6] = {
  19.     {0, 0, 0, 0, 0, 0},
  20.     {0, 2, 3, 0, 0, 0},
  21.     {0, 0, 5, 0, 5, 5},
  22.     {0, 0, 0, 4, 0, 0},
  23.     {0, 0, 5, 0, 5, 5},
  24.     {0, 0, 5, 0, 5, 5}
  25. };
  26.  
  27. const int FinalState[5] = { 0,0,0,0,1 };
  28.  
  29. void clearBuffer(void) {
  30.     int c;
  31.     while ((c = getchar()) != '\n' && c != EOF);
  32. }
  33.  
  34. int takeUserInput() {
  35.     int input;
  36.     bool isCorrect = false;
  37.     while (!isCorrect) {
  38.         isCorrect = true;
  39.         const int result = scanf("%d", &input);
  40.         if (result != 1) {
  41.             isCorrect = false;
  42.             printf("invalid input, try again\n");
  43.         }
  44.         clearBuffer();
  45.     }
  46.     return input;
  47. }
  48.  
  49. int takeUserInputFromRange(const int minValue, const int maxValue) {
  50.     int input = 0;
  51.     bool isCorrect = false;
  52.     while (!isCorrect) {
  53.         isCorrect = true;
  54.         input = takeUserInput();
  55.         if (input < minValue || input > maxValue) {
  56.             isCorrect = false;
  57.             printf("invalid input, range limited\n");
  58.         }
  59.     }
  60.     return input;
  61. }
  62.  
  63. enum charType getCharType(const char c) {
  64.     if (c == '0') {
  65.         return ctZero;
  66.     }
  67.     if (c > '0' && c <= '9') {
  68.         return ctDigit;
  69.     }
  70.     if ((c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
  71.         return ctLetter;
  72.     }
  73.     if (c == 'x' || c == 'X') {
  74.         return ctXLetter;
  75.     }
  76.     if (c == '$') {
  77.         return ctDollar;
  78.     }
  79.     return ctError;
  80. }
  81.  
  82. bool isHexString(const char* string);
  83.  
  84. void clearString(char* string, const size_t length) {
  85.     for (int i = 0; i < length; i++) {
  86.         string[i] = 0;
  87.     }
  88. }
  89.  
  90. void showValidSubstring(const char* string) {
  91.     const size_t length = strlen(string);
  92.     char *subString = malloc((length + 1) * sizeof(char));
  93.     clearString(subString, length + 1);
  94.     unsigned int index = 0;
  95.     for (int i = 0; i < length; i++) {
  96.         const enum charType charClass = getCharType(string[i]);
  97.         if (charClass != ctError) {
  98.             unsigned int tempState = 1;
  99.             unsigned int j = i;
  100.             bool isCorrect = true;
  101.             while (isCorrect && j < length) {
  102.                 const enum charType charLocalClass = getCharType(string[j]);
  103.                 if (charLocalClass == ctError) {
  104.                     isCorrect = false;
  105.                 }
  106.                 else {
  107.                     tempState = CURRENT_STATE[tempState][charLocalClass];
  108.                     if (tempState > 0) {
  109.                         subString[index++] = string[j];
  110.                     }
  111.                     else {
  112.                         isCorrect = false;
  113.                     }
  114.                 }
  115.                 j++;
  116.             }
  117.             if (isHexString(subString)) {
  118.                 printf("%s is a valid substring \n", subString);
  119.             }
  120.         }
  121.         clearString(subString, index);
  122.         index = 0;
  123.     }
  124. }
  125.  
  126. bool isHexString(const char* string) {
  127.     int currentState = 1;
  128.     const size_t length = strlen(string);
  129.     size_t i = 0;
  130.     bool isHex = true;
  131.     while (isHex && i < length) {
  132.         const enum charType charClass = getCharType(string[i]);
  133.         currentState = CURRENT_STATE[currentState][charClass];
  134.         isHex = currentState;
  135.         i++;
  136.     }
  137.     return isHex & FinalState[currentState - 1];
  138. }
  139.  
  140.  
  141. void takeCorrectFilePath(char* path, const size_t length) {
  142.     bool isCorrect = false;
  143.     printf("Please input the path of the correct file:\n");
  144.     while (!isCorrect) {
  145.         isCorrect = true;
  146.         fgets(path, length, stdin);
  147.         path[strcspn(path, "\n")] = 0;
  148.         FILE* file = fopen(path, "r");
  149.         if (file == NULL) {
  150.             printf("File not found\n");
  151.             isCorrect = false;
  152.         }
  153.         else {
  154.             fclose(file);
  155.         }
  156.     }
  157. }
  158.  
  159. int readIntegerFromFile(FILE* file) {
  160.     int number;
  161.     fscanf(file, "%d", &number);
  162.     fgetc(file);
  163.     return number;
  164. }
  165.  
  166. bool isSpaceSymbol(const char symbol) {
  167.     const bool result = symbol == ' ' || symbol == '\n' || symbol == '\r' || symbol == '\t';
  168.     return result;
  169. }
  170.  
  171. void Trim(char* string) {
  172.     const size_t length = strlen(string);
  173.     int startIndex = 0;
  174.     int endIndex = length - 1;
  175.     while (isSpaceSymbol(string[startIndex])) {
  176.         startIndex++;
  177.     }
  178.     while (isSpaceSymbol(string[endIndex])) {
  179.         endIndex--;
  180.     }
  181.     memmove(string, string + startIndex, endIndex + 1);
  182.     string[endIndex - startIndex + 1] = 0;
  183. }
  184.  
  185. void validateString(const char* string) {
  186.     if (isHexString(string)) {
  187.         printf("valid hex string: %s\n", string);
  188.     }
  189.     else {
  190.         showValidSubstring(string);
  191.         printf("not a valid hex string: %s\n", string);
  192.     }
  193. }
  194.  
  195. void freeStrings(char** strings, const size_t stringCount) {
  196.     if (strings != NULL) {
  197.         for (int i = 0; i < stringCount; i++) {
  198.             free(strings[i]);
  199.         }
  200.         free(strings);
  201.     }
  202. }
  203.  
  204. char** takeStringFormFile(void) {
  205.     char filePath[50];
  206.     takeCorrectFilePath(filePath, 50);
  207.     FILE* file = fopen(filePath, "r");
  208.     const int stringCount = readIntegerFromFile(file);
  209.     char **strings = malloc(stringCount * sizeof(char *));
  210.     for (int i = 0; i < stringCount; i++) {
  211.         const int maxStringLength = 25;
  212.         strings[i] = (char *)malloc(maxStringLength * sizeof(char));
  213.         if (fgets(strings[i], maxStringLength, file) != NULL) {
  214.             strings[i][strcspn(strings[i], "\n")] = '\0';
  215.             Trim(strings[i]);
  216.         }
  217.         else {
  218.             clearBuffer();
  219.         }
  220.     }
  221.     fclose(file);
  222.     return strings;
  223. }
  224.  
  225. char* takeStringFromConsole(const size_t length) {
  226.     bool isCorrect = false;
  227.     char* str = malloc(length * sizeof(char));
  228.     while (!isCorrect) {
  229.         isCorrect = true;
  230.         printf("Enter a string:", length);
  231.         fgets(str, length, stdin);
  232.         if (strlen(str) == 1) {
  233.             isCorrect = false;
  234.             printf("Empty string,enter a valid string \n \n");
  235.         }
  236.         else if (str[strlen(str) - 1] != '\n') {
  237.             isCorrect = false;
  238.             printf("Too long string, enter a valid string \n \n");
  239.             clearBuffer();
  240.         }
  241.         else {
  242.             Trim(str);
  243.         }
  244.     }
  245.     return str;
  246. }
  247.  
  248.  
  249. void fileProcess() {
  250.     char** strings = takeStringFormFile();
  251.     const int length = sizeof(strings) / sizeof(strings[0]);
  252.     for (int i = 0; i < length; i++) {
  253.         printf("%d: %s\n", i + 1, strings[i]);
  254.         validateString(strings[i]);
  255.         printf("\n");
  256.     }
  257.     freeStrings(strings, length);
  258. }
  259.  
  260. void consoleProcess(const size_t size) {
  261.     while (true) {
  262.         char *string = takeStringFromConsole(size);
  263.         string[strcspn(string, "\n")] = 0;
  264.         validateString(string);
  265.         printf("\n");
  266.         free(string);
  267.     }
  268. }
  269.  
  270. void takeStringFromUserInput(const size_t size) {
  271.     printf("Please enter input type: \n");
  272.     printf("0 - console, 1 - file \n");
  273.     const int input = takeUserInputFromRange(0, 1);
  274.     if (input == 0) {
  275.         consoleProcess(size);
  276.     }
  277.     else {
  278.         takeStringFormFile();
  279.     }
  280. }
  281.  
  282. int main(void) {
  283.     takeStringFromUserInput(15);
  284.     return 0;
  285. }
  286.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement