Загрузка...

Поиск палиндромов (assa adda) в строке на С.

Тема в разделе C/C++ создана пользователем slavazhulanov 19 апр 2020. 178 просмотров

Загрузка...
  1. slavazhulanov
    slavazhulanov Автор темы 19 апр 2020 0 17 окт 2018
    Требуется разработать программу, которая обеспечивает:
    1) возможность ввода строки со словами, разделенными пробелами
    2) вывод на экран полученной строки.

    Понимаю как это реализовать с одним словом, но как со строкой? Может мне кто то объяснить вообще логику реализации?

    Код
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


    int main (){
    char str[200] = "";

    printf("Входная строка:\n");
    gets(str);

    int l=0;
    int r=strlen(str)-1;


    while (r>1)
    {
    if (str[l++]==str[r--])
    {
    printf("%s Это палиндром",str);
    return 0;
    }
    else
    {
    printf("%s Это не палиндром",str);
    return 0;
    }
    return 0;
    }

    return 0;

    }
     
  2. Fender_inactive2697143
    slavazhulanov, как тебе мой вариант определения того, является ли строка полиндромом (регистрозависимо)?
    C
    #include <stdio.h>
    #include <stdbool.h>
    #include <string.h>

    bool isPalindrome(char str[])
    {
    char* curStr;
    strcpy(curStr, str);

    char* revStr;
    strcpy(revStr, strrev(str));

    return (strcmp(curStr, revStr) == 0);
    }

    int main()
    {
    char str[] = "aMMa";

    printf("%i\n", isPalindrome(str));
    return 0;
    }
     
    1. slavazhulanov Автор темы
      Fender_inactive2697143, еще лучше, но нужно чтобы он из строки слов доставал палиндромы и выводил их на экран
    2. Fender_inactive2697143
      slavazhulanov, ориентируйся на пробелы и знаки препинания.
  3. Fender_inactive2697143
    slavazhulanov, я решил более подробно объяснить тебе эту задачу, при этом, доработал свою функцию. Код прокомментирован полностью, если имеются вопросы, то смело задавай. Если у тебя дошли руки, и ты решил изменить предыдущий код, добавив ввод из консоли, к примеру, то программа вылетала бы с ошибкой сегментации (обращения к необъявленным участкам памяти). Кстати, в новом решении решил действовать по хардкору, отказался от использования директивы "string.h". Та-дам, а вот и новый код:
    C
    #include <stdio.h> // ввод и вывод
    #include <stdbool.h> // логические переменные в C, в C++ можно опустить
    #include <stdint.h> // целочисленные типы с фиксированным размером
    #include <stdlib.h> // работа с памятью
    #include <ctype.h> // функция tolower

    // параметры функции: строка для сравнения, регистрозависимое ли сравнение
    bool isPalindrome(char szStr[], bool regDep)
    {
    // выделяем переменную под физическую длину строки (без нуль-терминатора)
    uint32_t uStrLength = 0;
    while (szStr[uStrLength] != '\0') // пока не найден нуль-терминатор ...
    {
    ++uStrLength; // преинкрементируем переменную
    }

    if (uStrLength == 0) // если пользователь "засунул" в функцию пустую строку
    {
    return false; // возвращаем ложь
    }

    if (!regDep) // если сравнение НЕ регистрозависимое ...
    {
    for (uint32_t i = 0; i < uStrLength; i++) // проходимся посимвольно по исходной строке
    {
    szStr[i] = tolower(szStr[i]); // каждый символ ставим в нижний регистр, делаем соответствующую замену
    }
    }

    // выделяем память под новую строку-перевёртыш, учитываем и нуль-терминатор
    char* szRevStr = (char*)malloc(uStrLength * sizeof(char) + sizeof(char));
    for (uint32_t i = 0; i < uStrLength; i++) // посимвольно пробегаемся по свежей строчке
    {
    szRevStr[i] = szStr[uStrLength - 1 - i]; // переставляем символы
    }

    szRevStr[uStrLength] = '\0'; // добавляем ноль в конец

    // Визуализация алгоритма, описанного выше:
    // H e l l o \0
    // 0 1 2 3 4 5

    // o l l e H \0
    // 0 1 2 3 4 5

    // длина строки: 5

    // посимвольное сравнение 2-ух строк
    for (uint32_t i = 0; i < uStrLength; i++)
    {
    if (szStr[i] != szRevStr[i]) // если символы не совпали, то ...
    {
    return false; // возвращаем ложь
    }
    }
    // освобождаем память, выделенную под строку-перевертыш
    free(szRevStr);

    // если функция дошла до этого момента, то понятное дело, что строки равны, а следовательно
    // являются палиндромами, смело возвращаем истину
    return true;
    }

    int main()
    {
    char str[256];
    gets(str); // вводим строку

    // получение и обработка результата
    bool result = isPalindrome(str, false);
    printf("%s\n", result ? "yes" : "no");
    return 0;
    }
     
Top