Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2022, 04:29   #1
Fewmili
Новичок
Джуниор
 
Регистрация: 16.01.2022
Сообщений: 1
По умолчанию Cи, отсортировать числа от слов, изменение регистра.

Написана программа, которая выбирает из текста и выводит слова, в которых нет повторяющихся букв. Объем текста – не более 1000 символов, ввод с клавиатуры или из файла. Работает, все хорошо. Но как сделать так, чтобы ЧИСЛА не принимались за слова. А также при определении уникальности букв не учитывался регистр?


Код:
#define _CRT_SECURE_NO_WARNINGS

#include <string.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>

//проверяет слово заданное в виде границ на признак уникальности букв
int  is_print(const char* word, const char* end) {
    if (word == end)return 0; //слово отсутствует
    while (word != end) {
        const char* ww = word + 1;
        while (ww != end)
            if (*ww++ == *word)return 0; //буквы не уникальны
        word++;
    }
    return 1;
}

//парсит строку на слова и выводит слова с уникальными буквами
void parse(const char* line) {
    const char* delim = " ,.?!\n"; //массив символов разделителей
    char* start = line, * end; //границы слова
    do {
        end = strpbrk(start, delim); //конец слова
        if (!end)end = line + strlen(line);
        if (is_print(start, end)) { //проверка на выводимое слово
            char* word = malloc(end - start + 1);
            memcpy(word, start, end - start);
            word[end - start] = '\0';
            printf("%s ", word); //вывод слова
            free(word);
        }
        start = end + 1; //новое начало поиска слова
    } while (*end != '\0');
}

int main()
{
    setlocale(LC_ALL, "");
    system("chcp 1251");
    printf("Выберите вариант ввода 1 - с клавиатуры, 2 - из файла text.txt\n");
    char line[1001];
    fgets(line, 1000, stdin);
    if (atoi(line) == 1) //чтение ответа и выбор способа ввода
        fgets(line, 1000, stdin);
    else {
        FILE* f1 = fopen("text.txt", "r"); //открытие файла и чтение текста
        if (!f1)return;
        int len = fread(line, 1, 1000, f1);
        fclose(f1);
        line[len] = '\0';
    }
    parse(line); //парсинг текста
    return 0;
}

Последний раз редактировалось Fewmili; 16.01.2022 в 04:59. Причина: Скудный заголовок
Fewmili вне форума Ответить с цитированием
Старый 16.01.2022, 13:51   #2
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Цитата:
Сообщение от Fewmili Посмотреть сообщение
Но как сделать так, чтобы ЧИСЛА не принимались за слова.
При сравнении нужно проверять символ на принадлежность к цифрам, например isdigit

Цитата:
Сообщение от Fewmili Посмотреть сообщение
А также при определении уникальности букв не учитывался регистр?
При сравнении нужно сравнивать приведенные к одному регистру символы, например toupper или tolower
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц