Бесконечный цикл при попытке печати всех значений ASCII - PullRequest
1 голос
/ 13 октября 2019

Кажется, что я получаю бесконечный цикл, когда пытаюсь распечатать все 128 значений ASCII, и я не понимаю, почему. Вопрос просит меня написать программу, которая использует цикл для отображения символов для кодов ASCII от 0 до 127 и для отображения 16 символов в каждой строке. Я попытался использовать цикл for и сказал программе прекратить зацикливание, если моя переменная char выходит за 127, но по какой-то причине я получаю бесконечный цикл. Я даже написал оператор if, говорящий о разрыве цикла, если переменная char выходит за пределы 127, но, похоже, это тоже не работает. Вот мой код, любая обратная связь будет принята с благодарностью, спасибо.

#include <iostream>
using namespace std;

int main() {
    char a;

    for (char a = 0; a <= 127; a++)
    {
        cout << a << " ";
        if (a % 16 == 0)
            cout << endl;
        if (a > 127)
            break;
    }
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 13 октября 2019

Ваш тип char почти наверняка является подписанным (C / C ++ позволяет char быть подписанным или без знака (a) ), поэтому, когда вы добавляете один к 127, он переноситсяпримерно до -128 (на самом деле не предписано стандартным, но обычным поведением).

Следовательно, всегда меньше или равно 127.

Вы можете проверить это с помощью следующего кода:

#include <iostream>
using namespace std;

int main() {
    char x = 127;
    x++;
    cout << (int)x << endl;
    return 0;
}

Если это так, просто используйте unsigned char вместо char.


Вот некоторыекод, который выполняет эту работу, а также только распечатывает символы, специально помеченные как печатаемые:

#include <iostream>
using namespace std;

int main() {
    unsigned char a = 0;
    while (a < 128) {
        if (isprint(a)) {
            cout << a << " ";
        } else {
            cout << ". ";
        }
        if (++a % 16 == 0) {
            cout << endl;
        }
    }
    return 0;
}

Результаты:

. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~ .

(a) С C++ 17, basic.fundamental:

простой объект char может принимать либо те же значения, что и signed char, либо unsigned char;какой из них определяется реализацией.

0 голосов
/ 13 октября 2019

char - это подписанный символ, поэтому a + 128 = a

, что означает, что когда a == 127, a ++ дает вам 128 -> a = 0, так что условие все еще выполняется

вы можете исправить это с помощью = if (a> = 127) break;

или используйте do {} while (a! = 127)

0 голосов
/ 13 октября 2019

Ваша проблема в том, что тип данных char имеет диапазон от -128 до 127. Это также означает, что, когда вы добираетесь до a = 127, а затем a++, оно возвращается к a = -128 и затем продолжается. Поэтому, когда вы смотрите на условие a <= 127, оно всегда будет верным. Одним из вариантов может быть создание типа без знака

...