Переписть программу без использования функции 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, что означает успешное завершение программы.