C ++ muestra char mientras filas de bucle

Soy muy nuevo en la programación, así que me disculpo si esta pregunta parece absurdamente simple. Estoy trabajando en algunas preguntas adicionales en el capítulo actual de mi libro de C ++. De hecho, encontré una respuesta correcta al problema, pero mientras lo hacía, me encontré con una situación que me está volviendo loco porque no puedo entender POR QUÉ una solución en particular funciona y otra no.

Entonces, el problema pide imprimir los valores ASCII entre 32 y 127 en unas pocas filas con 16 caracteres por fila. La solución a la que he llegado (que funciona correctamente) es esta:

#include <iostream>
using namespace std;

int main()
{
  char letter;
  int count = 0;

  for (letter = 32; letter < 127; letter++, count++)
    {
      if (count == 16)
        {
          cout << endl;
          count = 0;
        }
      cout << letter << " ";
    }

  cout << endl;

  return 0;

}

Nuevamente, el código anterior funciona bien y hace lo que quiero. La dificultad radica en algo que probé antes. Intenté hacer el mismo problema con un bucle while anidado, así:

#include <iostream>
using namespace std;

int main()
{
  char letter = 32;
  int count;

  while (letter < 127)
    {
      count = 0;
      while (count < 16)
        {
          cout << letter << " ";
          letter++;
          count++;
        }
      cout << endl;
    }

  cout << endl;

  return 0;

}

Este ciclo while simplemente se ejecuta infinitamente y también escupe algo de basura después de los caracteres ASCII que quiero, y no puedo entender por qué. Lo que es aún más extraño es que si cambio la variable 'letra' en el código con un ciclo while a un int en lugar de un char, se ejecuta exactamente de la manera que quiero y termina cuando debería, solo mostrando los números reales en lugar del ASCII valores.

Es solo cuando 'letter' es un char que obtengo un bucle infinito. Estoy seguro de que es algo realmente simple, y puede que esté demasiado cansado para verlo en este momento, ¡pero cualquier ayuda / sugerencia sería muy apreciada! Aunque técnicamente obtuve la respuesta, me está volviendo loco que no sepa POR QUÉ la segunda respuesta falla tan horriblemente.

Gracias de antemano.

preguntado el 31 de enero de 12 a las 08:01

3 Respuestas

La respuesta es simple, bastante cierta. Esto es lo que sucede: el carácter (con signo) puede tener valores en el rango [-128, 127] en el bucle interno después de generar la fila hasta 112, aumenta el recuento con otros 16 y, por lo tanto, también aumenta la letra con 16, esto hace que la letra sea igual a 112 + 16 = 128, que debido al rango de caracteres con signo se desborda y se convierte en -128. Entonces, después de esta ejecución del ciclo interno, la condición del ciclo externo aún se mantiene: -128 <127. Por eso también obtienes caracteres extraños: estos serán los valores entre -128 y 32.

¿Como solucionar el problema? Cambie el cheque en el bucle interior: while (count < 16 && letter < 127)

Respondido el 31 de enero de 12 a las 12:01

Ahh eso tiene mucho sentido. ¡Gracias! - nik

El ciclo while interno sale cuando letter == 48, 64, ..., 128. Pero como es un carácter (con signo), 128 se interpreta como -128 y el ciclo externo no terminará. Cambie el bucle interior a

while (count < 16 && letter < 127)

para obtener el mismo comportamiento que en su primer ejemplo.

O cambie la letra a int, si está bien imprimir todos los caracteres, incluido 127:

int letter = 32;
...
cout << (char)letter << " ";

Respondido el 31 de enero de 12 a las 12:01

Prueba este código:

#include <iostream>
using namespace std;

int main()
{
  int letter;
  for (letter = 32; letter < 128; ++letter)
  {
     if (letter != 32 && letter % 16 == 0)
         cout << endl;

     cout << (char)letter << ' ';
  }
}

Respondido el 31 de enero de 12 a las 12:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.