Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int GetString(unsigned char* buffer, int maxLength) {
- if (!buffer)
- return -1;
- if (!fgets((char*)buffer, maxLength + 1, stdin))
- return -1;
- int length = 0;
- for (int i = 0; i < maxLength + 1; i++) {
- length = i;
- if (buffer[i] == '\n') {
- buffer[i] = '\0';
- break;
- }
- }
- if (fscanf(stdin, "\n") != 0)
- return -1;
- return length;
- }
- size_t GetInput(unsigned char* buffer, size_t count) {
- if (!buffer)
- return -1;
- int readCount = fread(buffer, sizeof(unsigned char), count, stdin);
- buffer[readCount] = '\0';
- return readCount;
- }
- // ------------------------------
- /////
- в main:
- /////
- // считывание needle
- unsigned char needle[17];
- size_t needleLength = GetString(needle, 16);
- if (needleLength <= 0)
- return;
- // ------------------------------
- // считывание в буфер
- это 1 раз считать (не в цикле)
- unsigned char* buffer = (unsigned char*)malloc((BUFFER_SIZE + 1) * sizeof(uchar));
- if (!buffer)
- return;
- // ------------------------------
- дальше после проверки текущего буфера
- нужно сдвигать его с определенной позиции в начало
- например:
- //размер буфера - 10
- //вход : needle - "example"; haystack - "this is simple example";
- сначала буфер будет таким: "this is si" (10 чаров)
- проверяем по алгоритму: e не равно s => сдвигаем на offset['s'] = 7
- следующий индекс для проверки будет = 6 (индекс s) + 7 = 13 - вышли за границы буфера
- поэтому
- сдвигаем начиная с [новый индекс для проверки (=13 в этом случае)] - needleLength + 1
- это выражение в этом примере имеет значение 7
- то есть
- берем все символы начиная с 7 индекса до конца буфера и ставим их в начало (здесь это " si")
- потом дочитываем таким образом:
- readCount = GetInput(buffer + [кол-во сдвинутых символов (=3 в нашем примере)], BUFFER_SIZE - [кол-во сдвинутых символов (то же самое)]);
- получится буфер:
- " si simple ex"
- повторяем то же самое, пока размер текущего буфера >= BUFFER_SIZE (если он < то очевидно символов больше в stdin нет)
- естественно нужно хранить кол-во уже считанных символов и прибавлять к выводящейся на экран позиции проверяемого символа
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement