Переписть программу без использования функции strtok - C (СИ)
Формулировка задачи:
Нужно переписть программу без использования функции strtok,
ну или пояснить какого типа переменная "P":
#include <stdio.h> #include <stdlib.h> #include <string.h> int test(char * buf, int size){ char * head, * tail; for ( head = buf, tail = buf + size - 1; head < tail; ++head, --tail ) if ( *head != *tail ) return 0; return 1; } #define DELIM " \t\n,.:;!?" int main(void){ char buf[BUFSIZ], * p; printf("String: "); if ( ! fgets(buf, BUFSIZ, stdin) ){ perror("fgets"); exit(1); } for ( p = strtok(buf, DELIM); p; p = strtok(NULL, DELIM) ) if ( test(p, strlen(p)) ) printf("%s\n", p); exit(0); }
Решение задачи: «Переписть программу без использования функции strtok»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> int test(char * buf, int size){ char * head, * tail; for ( head = buf, tail = buf + size - 1; head < tail; ++head, --tail ) if ( *head != *tail ) return 0; return 1; } #define DELIM " \t\n,.:;!?" int main(void){ char buf[BUFSIZ], tmp[BUFSIZ], * pHead, * pTail; printf("String: "); if ( ! fgets(buf, BUFSIZ, stdin) ){ perror("fgets"); exit(1); } pHead = buf; while ( 1 ){ while ( strchr(DELIM, *pHead) ) ++pHead; if ( ! ( pTail = strpbrk(pHead, DELIM) ) ){ if ( test(pHead, strlen(pHead)) ) printf("%s\n", pHead); break; } else { if ( test(pHead, pTail - pHead) ){ strncpy(tmp, pHead, pTail - pHead); tmp[pTail - pHead] = 0; printf("%s\n", tmp); } pHead = pTail; } } return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, string.h
- Определяется функция test, которая принимает два аргумента: buf и size. Функция проверяет, являются ли все символы в строке одинаковыми. Если это так, функция возвращает 1, в противном случае - 0.
- В функции main считывается строка из стандартного ввода с помощью функции fgets.
- Создаются две переменные: pHead и pTail. Переменная pHead указывает на начало строки, а pTail - на ее конец.
- В цикле while считываются символы строки до тех пор, пока не будет найден разделитель или не будет достигнут конец строки.
- Если найден разделитель, то проверяется, является ли подстрока между pHead и pTail уникальной. Если это так, то подстрока выводится на экран.
- Если подстрока не является уникальной, то считываются следующие символы до тех пор, пока не будет найден следующий разделитель.
- Если подстрока является уникальной, то она копируется в другую строку (tmp), и эта строка выводится на экран.
- Цикл while продолжается до тех пор, пока не будет достигнут конец строки.
- Функция main возвращает 0, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д