Вы выходите из функции по первому обнаруженному ненулевому символу, который равен '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