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

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, string.h
  2. Определяется функция test, которая принимает два аргумента: buf и size. Функция проверяет, являются ли все символы в строке одинаковыми. Если это так, функция возвращает 1, в противном случае - 0.
  3. В функции main считывается строка из стандартного ввода с помощью функции fgets.
  4. Создаются две переменные: pHead и pTail. Переменная pHead указывает на начало строки, а pTail - на ее конец.
  5. В цикле while считываются символы строки до тех пор, пока не будет найден разделитель или не будет достигнут конец строки.
  6. Если найден разделитель, то проверяется, является ли подстрока между pHead и pTail уникальной. Если это так, то подстрока выводится на экран.
  7. Если подстрока не является уникальной, то считываются следующие символы до тех пор, пока не будет найден следующий разделитель.
  8. Если подстрока является уникальной, то она копируется в другую строку (tmp), и эта строка выводится на экран.
  9. Цикл while продолжается до тех пор, пока не будет достигнут конец строки.
  10. Функция main возвращает 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы