C ++ отображает символ в то время как строки цикла - PullRequest
1 голос
/ 31 января 2012

Я очень новичок в программировании, поэтому я прошу прощения, если этот вопрос кажется нелепо простым.Я работаю над некоторыми дополнительными вопросами в текущей главе моей книги C ++.Я действительно нашел правильный ответ на проблему, но при этом я столкнулся с ситуацией, которая сводит меня с ума, потому что я не могу понять, ПОЧЕМУ одно конкретное решение работает, а другое нет.

Итак, проблема состоит в том, чтобы напечатать значения ASCII между 32 и 127 в несколько строк по 16 символов в строке.Решение, к которому я пришел (работает правильно), таково:

#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;

}

Опять же, приведенный выше код работает нормально и делает то, что я хочу.Трудность заключается в том, что я пытался до этого.Я пытался проделать ту же проблему с помощью вложенного цикла while, например так:

#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;

}

Этот цикл while просто работает бесконечно, а также выплевывает мусор после нужных символов ASCII, и я не могу понятьпочему.Что еще более странно, если я изменю переменную «буква» в коде с помощью цикла while на int вместо char, он будет работать именно так, как я хочу, и завершится, когда это необходимо, просто отображая действительные числа вместо ASCIIценности.

Только когда «буква» является символом, я получаю бесконечный цикл.Я уверен, что это что-то действительно простое, и я, возможно, просто слишком устал, чтобы видеть это прямо сейчас, но любая помощь / подсказки будет высоко ценится!Хотя технически я получил ответ, меня сводит с ума то, что я не знаю, ПОЧЕМУ второй ответ терпит неудачу так ужасно.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 31 января 2012

Ответ прост, достаточно правдив. Вот что происходит - (со знаком) char может иметь значения в диапазоне [-128, 127] во внутреннем цикле после того, как вы выведите строку до 112, вы увеличиваете счетчик еще на 16, и поэтому вы также увеличиваете букву на 16, это делает букву равной 112 + 16 = 128, которая из-за диапазона знаковых символов фактически переполняется и становится -128. Таким образом, после этого выполнения внутреннего цикла условие внешнего цикла все еще выполняется: -128 <127. Вот почему вы также получаете странные символы - это будут значения между -128 и 32. </p>

Как решить проблему? Измените проверку во внутреннем цикле: while (count < 16 && letter < 127)

1 голос
/ 31 января 2012

Внутренний цикл while завершается, когда буква == 48, 64, ..., 128. Но так как это символ (со знаком), 128 интерпретируется как -128, и внешний цикл не прерывается. Измените внутренний цикл на

while (count < 16 && letter < 127)

, чтобы получить то же поведение, что и в вашем первом примере.

Или измените букву на int, если все в порядке, чтобы напечатать все символы, включая 127:

int letter = 32;
...
cout << (char)letter << " ";
0 голосов
/ 31 января 2012

Попробуйте этот код:

#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 << ' ';
  }
}
...