Я новичок в C, и мне задали вопрос написать программу для проверки слов-палиндромов. Я сделал следующий код, он дает вывод. но вывод всегда "Нет". Идея того, что я сделал в этом коде, заключается в том, что я сначала разделил строку и поместил ее в один стек (stacka). затем переместил остальные письма в другой стек (stackb). Затем я извлекаю оба этих стека и проверяю, равны ли буквы, возвращаемые каждой функцией pop (stacka и stackb), или нет. если нет, он вернет 0. ниже приведен код. Заранее спасибо. Хорошего дня!.
#include <stdio.h>
#include <string.h>
char stacka[5];
char stackb[5];
int topa = -1;
int topb = -1;
void pusha(char e) {
topa++;
stacka[topa] = e;
}
void pushb(char e) {
topb++;
stackb[topb] = e;
}
char popa() {
char e = stacka[topa];
topa--;
return e;
}
char popb() {
char e = stackb[topb];
topb--;
return e;
}
int palindrome(char str[]) {
int i, length = strlen(str);
int mid = length / 2;
for (i = 0; i < mid; i++) {
pusha(str[i]);
}
if (length % 2 != 0) {
i++;
}
for (i = length - 1; i >= mid; i--) {
pushb(str[i]);
}
int f;
for (f = mid; f >= 0; f--) {
char ele1 = popa();
char ele2 = popb();
if (ele1 != ele2)
return 0;
}
return 1;
}
int main() {
char str[] = "madam";
if (palindrome(str)) {
printf("Yes");
} else
printf("No");
}
@a.Li результат всегда один и тот же, каждый раз будет возвращаться да или нет. но ответ неверный.
Извините, но это звучит слишком запутанно. Почему бы вам просто не сравнить символы, начиная с крайних, это требование задания?
Есть ли причина, по которой вы решили использовать стек? Это выполнимо, но немного запутанно. Вы можете найти Как убрать пробелы и проверить, является ли строка палиндромом? Короче, если это интересно.
Используйте GCC как gcc -Wall -Wextra -g
, а затем используйте GDB, чтобы понять поведение вашего исполняемого файла.
Вам действительно нужно запустить его под отладчиком. Прочтите, как настроить его на своем компьютере, или используйте, например. онлайнgdb. Отладка — это не просто запуск вашей программы и просмотр результатов — есть инструмент, называемый отладчиком, который позволяет вам видеть состояние программы «изнутри», а не снаружи (просто глядя на напечатанные результаты).
На первый взгляд, я обнаружил следующие проблемы в вашем коде.
if (length % 2 !=0)
{
i++;
}
for(i=length-1;i>=mid;i--)
{
pushb(str[i]);
}
Ваш блок if
не влияет на код, да и не нужен. for loop
также имеет проблему, которая может вызвать вашу проблему.
Позвольте мне немного уточнить. Допустим, ваш ввод «мадам», и, согласно вашему решению, первый цикл for работает нормально.
int mid=length/2;
for(i=0;i<mid;i++)
{
pusha(str[i]);
}
Поскольку вы вводите «мадам», ваше значение для mid
будет 2
. поэтому первая стопка будет содержать буквы «м», «а». Это нормально до этого.
Во втором for loop
есть проблема,
for(i=length-1;i>=mid;i--)
{
pushb(str[i]);
}
В соответствии с этим стек будет содержать 'm', 'a', 'd'.
Теперь я бы сказал поправку здесь по моему мнению. Прежде всего, вы удаляете первый блок if
, затем делаете эту модификацию во втором for loop
.
for(i=length-1;i>mid;i--)
{
pushb(str[i]);
}
Затем, наконец, в последний for loop
,
for(f=mid-1;f>=0;f--)
{
char ele1=popa();
char ele2=popb();
if (ele1!=ele2)
return 0;
}
Я не компилировал и не запускал код с моими исправлениями. Но я думаю, что это поможет вам разобраться в проблемах с вашим кодом.
Есть несколько проблем с кодом, но этот ответ указал только на одну из них. Удаление оператора if не заставит программу работать.
தலைவா எனக்கு ஆங்கிலம் நல்லா வராது.
Сначала вы измените условие цикла for в функции палиндрома.
for(i=length-1;i>mid;i--)
{
pushb(str[i]);
}
Ваша программа правильная.
Вы можете удалить этот повторяющийся ответ.
Сначала вы измените условие цикла for в функции палиндрома.
for(i=length-1;i>mid;i--)
{
pushb(str[i]);
}
Какую отладку вы пробовали и каков был результат?