Siempre ten presente que las funciones deben hacer una sola cosa (o construir una cadena inversa, o imprimirla, pero no ambas). Como tú solamente quieres imprimir, pues que `reverse` imprima, sin más dilación. Si sigues éste principio, tus códigos quedarán siempre mucho más claros. Por otro lado, siempre que trabajes con tamaños e índices, utiliza `size_t`, que no es más que un alias de `unsigned`, pero está pensado precisamente para recorridos y tamaños (`int` y `unsigned` deberían ser usados para problemas más "numéricos" o matemáticos).
void reverse(char const* str)
{
// Bucle en dirección inversa.
for (size_t i = strlen(str) - 1; i >= 0; --i)
cout << str[i];
cout << endl;
}
int main()
{
reverse("linda");
system("pause");
return 0;
}
Un truco aprendido por ahí, que simplifica mucho el trabajo, es utilizar "-->", que no es un operador, sino sencillamente, postdecremento y "mayor que", pero se escriben juntos para que parezca una flechita en dirección al 0 (salida del bucle):
void reverse(char const* str)
{
size_t i = strlen(str);
while (i --> 0)
cout << str[i];
cout << endl;
}
Queda aún más claro, y más legible. Al utilizar un postdecremento de `i`, y suponiéndo que strlen(str) == 5, el `while` va a comparar `i` con los valores 5, 4, 3, 2 y 1 (5 elementos, todos mayores que cero), pero dentro del `while`, debido a que el postdecremento actúa más tarde, los valores serán 4, 3, 2, 1 y 0 (los índices de la cadena), y además, en órden inverso, que es justo lo que quieres.
Si lo que quisieras fuera construir la cadena inversa, e imprimirla fuera, siguiendo el principio de que cada función haga solamente una cosa, pues podría ser así:
// La cadena devuelta por `reverse` es dinámica, y el usuario de la función es responsable de
// eliminarla.
char* reverse(char const* str)
{
size_t len = strlen(str);
char* rev = new char[len + 1]; // 1 extra para el '\0'.
for (size_t i = 0; i < len; ++i)
rev[i] = str[len - i - 1];
rev[len] = '\0';
return rev;
}
int main()
{
char const* rev = reverse("linda");
cout << rev << endl;
delete[] rev;
system("pause");
return 0;
}