Строчные буквы в массиве символов [] в C ++ через указатели - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь использовать указатели для рекурсивной строчной буквы всех заглавных букв

с использованием языка программирования C ++. Ниже приведен фрагмент кода:

// Example program
#include <iostream>
#include <string>
using namespace std;

void all_lower(char* input) {

    if ( *input ) {
        cout << input << endl;
        return;
    }

    if ( *input >= 'A' && *input <= 'Z') {    
       *input += 32; // convert capital letter to lowercase
    }
    cout << *input << endl;

    all_lower(++input); // simply move to next char in array
}

int main() {
   char test[] = "Test";
   all_lower(test);
   return 0;
}

В итоге получается:

"Тест"

, хотя я пытался увеличить значение ASCII-кода элемента на 32.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Что-то короткое и простое:

#include <iostream>
#include <string>
using namespace std;

void all_lower(const char* input) {
    if (!*input) {
        std::cout << std::endl;
        return;
    }
    std::cout << (char)(std::isalpha(*input) ? tolower(*input) : *input);
    all_lower(++input); // simply move to next char in array
}

int main() {
   all_lower("Test");
   return 0;
}
0 голосов
/ 10 мая 2018

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

Вы должны изменить это:

if ( *input ) {
    cout << input << endl;
    return;
}

На это вместо:

if ( *input == 0 ) {
    return;
}

Тогда функция будет работать как положено.

При этом я предлагаю вам удалить операторы cout из функции и сделать один cout в main() после выхода из функции. Это ускорит функцию и докажет, что содержимое массива test[] действительно изменяется:

#include <iostream>
using namespace std;

void all_lower(char* input)
{
    if ( *input == 0 ) {
        return;
    }

    if ( *input >= 'A' && *input <= 'Z') {    
       *input += 32; // convert capital letter to lowercase
    }    

    all_lower(++input); // simply move to next char in array
}

int main()
{
   char test[] = "TEST";
   cout << "Before: " << test << endl;
   all_lower(test);
   cout << "After: " << test << endl;
   return 0;
}

Демонстрационная версия

И, поскольку вы используете C ++, рассмотрите возможность полного удаления all_lower() и используйте вместо него алгоритм STL std::transform():

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
   char test[] = "TEST";
   cout << "Before: " << test << endl;
   transform(test, test+4, test, [](char ch){ return tolower(ch); });
   cout << "After: " << test << endl;
   return 0;
}

Live Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...