Advertisement
gguuppyy

KT1lab_last_version

Sep 17th, 2024 (edited)
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.09 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. enum CharType {
  9.     ctError, ctDollar, ctZero, ctXLetter, ctDigit, ctLetter
  10. };
  11.  
  12. const int CURRENT_STATE[6][6] = {
  13.     {0, 0, 0, 0, 0, 0},
  14.     {0, 2, 3, 0, 0, 0},
  15.     {0, 0, 5, 0, 5, 5},
  16.     {0, 0, 0, 4, 0, 0},
  17.     {0, 0, 5, 0, 5, 5},
  18.     {0, 0, 5, 0, 5, 5}
  19. };
  20.  
  21. const int FINAL_STATE[5] = { 0, 0, 0, 0, 1 };
  22.  
  23. void clearInputBuffer() {
  24.     while (getchar() != '\n');
  25. }
  26.  
  27. int getInputChoice() {
  28.     int input;
  29.     while (scanf("%d", &input) != 1) {
  30.         clearInputBuffer();
  31.         printf("Invalid input, please try again:\n");
  32.     }
  33.     clearInputBuffer();
  34.     return input;
  35. }
  36.  
  37. enum CharType identifyCharType(char c) {
  38.     if (c == '0') return ctZero;
  39.     if (c >= '1' && c <= '9') return ctDigit;
  40.     if ((c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) return ctLetter;
  41.     if (c == 'x' || c == 'X') return ctXLetter;
  42.     if (c == '$') return ctDollar;
  43.     return ctError;
  44. }
  45.  
  46. bool checkHexString(const char* str) {
  47.     int state = 1;
  48.     while (*str) {
  49.         state = CURRENT_STATE[state][identifyCharType(*str++)];
  50.         if (state == 0) return false;
  51.     }
  52.     return FINAL_STATE[state - 1];
  53. }
  54.  
  55. void validateHexString(const char* str) {
  56.     if (checkHexString(str)) {
  57.         printf("Valid hex string: %s\n", str);
  58.     }
  59.     else {
  60.         printf("Not a valid hex string: %s\n", str);
  61.     }
  62. }
  63.  
  64. void removeWhitespace(char* str) {
  65.     char* end = str + strlen(str) - 1;
  66.     while (end > str && isspace((unsigned char)*end)) end--;
  67.     *(end + 1) = '\0';
  68.     while (*str && isspace((unsigned char)*str)) str++;
  69. }
  70.  
  71. char* readStringFromConsole(size_t length) {
  72.     char* str = malloc(length);
  73.     printf("Enter a string: ");
  74.     fgets(str, length, stdin);
  75.     removeWhitespace(str);
  76.     return str;
  77. }
  78.  
  79. void extractHexSubstrings(const char* str) {
  80.     size_t length = strlen(str);
  81.     printf("Finding valid hex substrings:\n");
  82.  
  83.     for (size_t start = 0; start < length; start++) {
  84.         for (size_t end = start + 1; end <= length; end++) {
  85.             char* substring = malloc(end - start + 1);
  86.             strncpy(substring, str + start, end - start);
  87.             substring[end - start] = '\0';
  88.  
  89.             if (checkHexString(substring)) {
  90.                 printf("Valid hex substring: %s\n", substring);
  91.             }
  92.  
  93.             free(substring);
  94.         }
  95.     }
  96. }
  97.  
  98. void handleFileInput() {
  99.     char filePath[50];
  100.     printf("Enter the file path:\n");
  101.     fgets(filePath, sizeof(filePath), stdin);
  102.     removeWhitespace(filePath);
  103.  
  104.     FILE* file = fopen(filePath, "r");
  105.     if (!file) {
  106.         printf("File not found.\n");
  107.         return;
  108.     }
  109.  
  110.     int stringCount;
  111.     fscanf(file, "%d", &stringCount);
  112.     fgetc(file);
  113.  
  114.     for (int i = 0; i < stringCount; i++) {
  115.         char str[100];
  116.         if (fgets(str, sizeof(str), file)) {
  117.             removeWhitespace(str);
  118.             validateHexString(str);
  119.             extractHexSubstrings(str);
  120.         }
  121.     }
  122.     fclose(file);
  123. }
  124.  
  125. void handleUserInput() {
  126.     printf("Choose input method (0 - console, 1 - file): ");
  127.     int choice = getInputChoice();
  128.  
  129.     if (choice == 0) {
  130.         char* str = readStringFromConsole(100);
  131.         validateHexString(str);
  132.         extractHexSubstrings(str);
  133.         free(str);
  134.     }
  135.     else {
  136.         handleFileInput();
  137.     }
  138. }
  139.  
  140. int main() {
  141.     handleUserInput();
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement