Требуется разработать программу, которая обеспечивает: 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; } Код #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; }
slavazhulanov, как тебе мой вариант определения того, является ли строка полиндромом (регистрозависимо)? #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; } 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; }
Fender_inactive2697143, еще лучше, но нужно чтобы он из строки слов доставал палиндромы и выводил их на экран
slavazhulanov, я решил более подробно объяснить тебе эту задачу, при этом, доработал свою функцию. Код прокомментирован полностью, если имеются вопросы, то смело задавай. Если у тебя дошли руки, и ты решил изменить предыдущий код, добавив ввод из консоли, к примеру, то программа вылетала бы с ошибкой сегментации (обращения к необъявленным участкам памяти). Кстати, в новом решении решил действовать по хардкору, отказался от использования директивы "string.h". Та-дам, а вот и новый код: #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; } 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; }