Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. int GetString(unsigned char* buffer, int maxLength) {
  2.     if (!buffer)
  3.         return -1;
  4.  
  5.     if (!fgets((char*)buffer, maxLength + 1, stdin))
  6.         return -1;
  7.  
  8.     int length = 0;
  9.     for (int i = 0; i < maxLength + 1; i++) {
  10.         length = i;
  11.         if (buffer[i] == '\n') {
  12.             buffer[i] = '\0';
  13.             break;
  14.         }
  15.     }
  16.  
  17.     if (fscanf(stdin, "\n") != 0)
  18.         return -1;
  19.  
  20.     return length;
  21. }
  22.  
  23. size_t GetInput(unsigned char* buffer, size_t count) {
  24.     if (!buffer)
  25.         return -1;
  26.  
  27.     int readCount = fread(buffer, sizeof(unsigned char), count, stdin);
  28.     buffer[readCount] = '\0';
  29.     return readCount;
  30. }
  31. // ------------------------------
  32. /////
  33. в main:
  34. /////
  35.  
  36. // считывание needle
  37. unsigned char needle[17];
  38. size_t needleLength = GetString(needle, 16);
  39. if (needleLength <= 0)
  40.     return;
  41.  
  42. // ------------------------------
  43.  
  44. // считывание в буфер
  45. это 1 раз считать (не в цикле)
  46.  
  47. unsigned char* buffer = (unsigned char*)malloc((BUFFER_SIZE + 1) * sizeof(uchar));
  48. if (!buffer)
  49.     return;
  50.  
  51. // ------------------------------
  52. дальше после проверки текущего буфера
  53. нужно сдвигать его с определенной позиции в начало
  54. например:
  55. //размер буфера - 10
  56. //вход : needle - "example"; haystack - "this is simple example";
  57. сначала буфер будет таким: "this is si" (10 чаров)
  58. проверяем по алгоритму: e не равно s => сдвигаем на offset['s'] = 7
  59. следующий индекс для проверки будет = 6 (индекс s) + 7 = 13 - вышли за границы буфера
  60. поэтому
  61. сдвигаем начиная с [новый индекс для проверки (=13 в этом случае)] - needleLength + 1
  62. это выражение в этом примере имеет значение   7
  63. то есть
  64. берем все символы начиная с 7 индекса до конца буфера и ставим их в начало (здесь это " si")
  65. потом дочитываем таким образом:
  66. readCount = GetInput(buffer + [кол-во сдвинутых символов (=3 в нашем примере)], BUFFER_SIZE - [кол-во сдвинутых символов (то же самое)]);
  67. получится буфер:
  68. " si simple ex"
  69. повторяем то же самое, пока размер текущего буфера >= BUFFER_SIZE (если он < то очевидно символов больше в stdin нет)
  70.  
  71. естественно нужно хранить кол-во уже считанных символов и прибавлять к выводящейся на экран позиции проверяемого символа
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement