2017-01-04 6 views
0

Он должен преобразовать строку следующим образом: Пример: HEloOO, должен быть преобразован в: heLOoo. По какой-то причине это не работает, оно просто не конвертирует буквы из верхнего регистра в нижний регистр, и наоборот, любая помощь будет оценена по достоинству?Как сделать рекурсивную функцию, необходимо проверить, соответствует ли текущая буква, а следующая - строчной или верхней строкой?

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

void rek(char array[], int d) 
{ 
    int counter=0; 

    if(d==0) 
    { 
     printf("%s \n",array); 
     printf("%d \n",counter); 
    } 
    else 
    { 
     if((array[d]>='A' && array[d]<='Z')&&(array[d-1]>='A' && array[d-1]<='Z')) 
     { 
      array[d]=array[d]+32; 
      array[d-1]=array[d-1]+32; 
      counter++; 
      rek(array,d-2); 
     } 
     if((array[d]>='a' && array[d]<='z')&&(array[d-1]>='a' && array[d-1]<='z')) 
     { 
      array[d]=array[d]-32; 
      array[d-1]=array[d-1]-32; 
      counter++; 
      rek(array,d-2); 
     } 
    } 
} 

int main() 
{ 
    char array[100]; 
    int d; 

    gets(array); 
    d=strlen(array); 

    rek(array,d); 

    return 0; 
} 
+1

Это, вероятно, не проблема, но в стандартном C или стандартном C++ нет ничего, что требует 'array [d]> = 'A' && array [d] <= 'Z'' делать что-либо разумное , Используйте 'std :: isupper' и' std :: islower'. Также читайте о 'std :: topper' и' std :: tolower'. –

+1

Используйте 'printf' для отображения значений' d', 'array [d]' и 'array [d-1]' в начале функции 'rek', и проблема должна быть очевидной. – user3386109

+1

Также обратите внимание, что у вас возникнет проблема, если 'd' всегда является нечетным числом, потому что в этом случае рекурсивный вызов никогда не достигнет' 0'. – user3386109

ответ

0

главная проблема заключается в том, что вы повторялись только если ваш есть пара прописными или строчными буквами. В противном случае вы опустите конец , если, вернитесь к вызывающей программе и прекратите конвертирование.

Исходная проблема заключается в том, что вы указали свою строку на длину. Строка с 6 символами имеет индексы 0-5, но вы начали с мест 5 и 6 - окончательного «O» и нулевого символа.

В результате вы проверяете 'O' и '\ 0'; последний не является алфавитом вообще, поэтому вы проваливаете всю свою логику, ничего не делая, возвращайтесь к основной программе и заканчиваете.

Для справки в дальнейшем, здесь используется отладочная аппаратура. Также см. Канонический SO debug help.

#include<stdio.h> 
#include<string.h> 
#include<ctype.h> 
void rek(char array[], int d) 
{ 
    int counter=0; 

    printf("ENTER rek %s %d\n", array, d); 

    if(d==0) 
    { 
     printf("%s \n",array); 
     printf("%d \n",counter); 
    } 
    else 
    { 
     printf("TRACE 1: %d %c%c\n", d, array[d-1], array[d]); 
     if((array[d]>='A' && array[d]<='Z')&&(array[d-1]>='A' && array[d-1]<='Z')) 
     { 
      printf("TRACE 2: upper case"); 
      array[d]=array[d]+32; 
      array[d-1]=array[d-1]+32; 
      counter++; 
      rek(array,d-2); 
     } 
     if((array[d]>='a' && array[d]<='z')&&(array[d-1]>='a' && array[d-1]<='z')) 
     { 
      printf("TRACE 3: lower case"); 
      array[d]=array[d]-32; 
      array[d-1]=array[d-1]-32; 
      counter++; 
      rek(array,d-2); 
     } 
    } 
} 
int main() 
{ 
    char *array; 
    int d; 

    array = "HEloOO"; 
    d=strlen(array); 

    rek(array,d); 
    printf("%s\n", array); 

    return 0; 
} 
+0

Спасибо большое за помощь –

+0

Добро пожаловать. Не забудьте принять ваш любимый ответ и проголосовать за полезные комментарии. – Prune

+1

Зачем использовать магическое число 32? Возможно, 'array [d] = array [d] +32;' -> 'array [d] = array [d] + ('a' - 'A');' который сам документирует больше намерений. Чтобы скрывать верхний и нижний, код может использовать 'array [d]^= 'a' & 'A';', который работает для ASCII и EBCDIC.Конечно, 'tolower()' довольно стандартный. – chux

1

Ваша функция не называет себя, когда два соседних символа имеют разные случаи. Также вы можете получить разные результаты, когда строка обрабатывается с самого начала или с конца.

Я бы записать функцию следующим образом

#include <stdio.h> 
#include <ctype.h> 

char * rek(char *s) 
{ 
    if (s[0] && s[1]) 
    { 
     size_t i = 1; 
     if (islower((unsigned char)s[0]) && islower((unsigned char)s[1])) 
     { 
      s[0] = toupper((unsigned char)s[0]); 
      s[1] = toupper((unsigned char)s[1]); 
      ++i; 
     } 
     else if (isupper((unsigned char)s[0]) && isupper((unsigned char)s[1])) 
     { 
      s[0] = tolower((unsigned char)s[0]); 
      s[1] = tolower((unsigned char)s[1]); 
      ++i; 
     } 

     rek(s + i); 
    } 

    return s; 
} 

int main(void) 
{ 
    char s[] = "HEloOO"; 

    puts(rek(s)); 

    return 0; 
} 

Выход программы

heLOoo 
0

Я придумал этот грязный раствор:

#include <iostream> 
#include <string> 
#include <cctype> 

using namespace std; 

string solve(const string& str) 
{ 
    if (str.empty()) { 
     return ""; 
    } 
    if (str.front() >= 'a' && str.front() <= 'z') { 
     return (char)toupper(str.front()) + solve(str.substr(1)); 
    } 
    if (str.front() >= 'A' && str.front() <= 'Z') { 
     return (char)tolower(str.front()) + solve(str.substr(1)); 
    } 
} 

int main() 
{ 
    string str; 
    cin >> str; 
    cout << solve(str) << endl; 
    return 0; 
} 
Смежные вопросы