Сравнение двух разных строк с одинаковыми именами в c - PullRequest
0 голосов
/ 06 ноября 2018

Я учусь кодировать на c прямо сейчас, поэтому следующим шагом в моей повестке дня стало изучение рекурсивного кодирования. Для этого я попытался написать код, который принимает пользовательский ввод, затем рекурсивно меняет его и сообщает, является ли он palindrome или нет.

Текущие выпуски номер 3. Первое - это то, писал ли я даже рекурсивно, второе относится к тому, какое сравнение строк мне нужно сделать в этой части кода, чтобы определить, является ли оно palindrome или нет:

int main(){

//char stringran[256];
//char done;
char str1[1024];
int size;

printf("Enter a string to reverse, or done to exit program: ");

scanf("%s", str1);

size = strlen(str1);

printf("The string you enterred is: %s\n", str1);

reverse(str1, 0, size - 1);

printf("The string after reversing is: %s\n", str1);
 //the if-else statement below is the issue, currently i have a  placeholder//
if(str1 == str1){
    printf("The string is a palindrome");
}
else{
    printf("The string is not a palindrome");
}

Наконец, если я захочу зациклить код, чтобы он продолжал задавать начальный вопрос после ввода строки (введите строку, чтобы повернуть ее вспять, или сделайте, чтобы выйти из программы), как мне поступить? Будет ли это цикл for или цикл while? *

Полный код с выводом:

https://onlinegdb.com/Sk_vTLJp7

1 Ответ

0 голосов
/ 06 ноября 2018

"Текущие выпуски № 3"

  1. «Во-первых, пишу ли я рекурсивно или нет».

Да, ваша reverse() функция рекурсивная. Любая функция, которая вызывает себя, является рекурсивной. Однако очень легко написать рекурсивную функцию, которая работает неправильно, плохо обрабатывает соответствующие случаи, портит управление памятью или работает бесконечно. Программирование на C требует большой осторожности; Написание рекурсивных функций требует еще большей осторожности.

Как отмечено в комментариях, обнаружение палиндрома не требует рекурсивной функции. Как упражнение, я полагаю, что все в порядке, но (1) если бы вы столкнулись с этой проблемой по-настоящему, вам было бы гораздо лучше подойти к ней совершенно по-другому, и (2) есть гораздо лучшие проблемы для изучения рекурсии из-за будучи более простым и более подходящим для рекурсивного подхода. Google здесь твой друг.

  1. "какое сравнение строк мне нужно сделать в этой части кода, чтобы определить, палиндром это или нет"

Главное, что вам нужно сделать, это сравнить две вещи, которые могут отличаться. Как отмечают комментарии, str1 == str1 всегда true. Вы указываете, что это код заполнителя (так что он компилируется). Лучший код заполнителя будет:

if (1) {  // placeholder code so that it compiles

Это бы устранило немного путаницы.

Что касается сравнения, которое вам нужно сделать, просто сделайте копию str1 перед ее изменением. Затем сравните предварительно измененную копию с измененным значением. Но будьте уверены, что знаете, что делаете, когда делаете копию str1. Поскольку для вас еще не было очевидным, что вам нужно это делать, для вас может не быть очевидным, как сделать это. Это одна из ловушек C, которую легко ошибиться. Опять же, Google поможет вам здесь.

  1. "если я захочу зациклить код, чтобы он продолжал задавать начальный вопрос после ввода строки, как бы я это сделал? Это цикл for или цикл while?"

Любой из них будет работать, поскольку написать цикл for, который действует как цикл while, тривиально. Реальный вопрос в том, при каких обстоятельствах вы бы вышли из цикла? Ответ на этот вопрос укажет вам как наилучший тип цикла, так и условие цикла для его предоставления.

...