ANSI-C преобразование char в int, представляемый ascii - PullRequest
0 голосов
/ 22 января 2010

привет, меня интересуют те символы, которые представлены в таблице ascii. по этой причине я делаю следующее:

       int t(char c) { return (int) c; }
       ...
       if(!(t(d)>255)) { dostuff(); }

так что меня интересуют только представляемые символы таблицы ascii, которые, как я полагаю, после преобразования в int должны быть меньше 256, я прав? спасибо!

Ответы [ 5 ]

5 голосов
/ 22 января 2010

Использовать библиотеку:

#include <ctype.h>

...
if (isascii(d)) { dostuff(); }
5 голосов
/ 22 января 2010

Обычно (не всегда) символ состоит из 8 бит, поэтому все символы обычно имеют значение меньше 256. Таким образом, ваш тест всегда будет успешным.

Кроме того, ASCII только до 127, а не 255. Символы после этого не являются стандартными ASCII и могут варьироваться в зависимости от кодовых страниц.

Если вы имеете дело с международными символами, вам, вероятно, следует использовать широкие символы вместо символа.

1 голос
/ 22 января 2010

Два предостережения:

  1. Стандарт C не определяет, является ли char по умолчанию signed или unsigned. Если ваш компилятор обработал char как подписанный по умолчанию, приведение к int может привести к отрицательным значениям вместо значений от 128 до 255 (и это предполагает, что ваши char тоже 8-битные). Возможно, лучше использовать unsigned char, если вы хотите быть уверены, что этот диапазон будет преобразован так, как вы ожидаете.

  2. Технически ASCII имеет значение от 0 до 127, все вышеперечисленное является некоторым расширением.

0 голосов
/ 22 января 2010

char является целочисленным типом в C. Вы можете выполнить проверку напрямую:

char c;
/* assign to c */
if (c >= 0 && c <= 127) {
    /* in ASCII range */
}

Я предполагаю, что вы не хотите использовать isascii() (это не соответствует стандарту C, хотя это POSIX).

Кроме того, вы можете проверить, равно ли CHAR_MAX 127. Если это так, вам не нужно сравнение с 127, поскольку c не будет превышать его по определению. Аналогично, если CHAR_MIN равно 0, то сравнение с 0. Вам не нужно сравнивать. Оба CHAR_MIN и CHAR_MAX определены в limits.h.

Я думаю, вы думаете о целочисленном значении, переполняющем char, и поэтому преобразуете его в int. Но это не поможет с переполнением, так как ущерб уже нанесен.

0 голосов
/ 22 января 2010

Размер char всегда равен 1 байту (согласно стандарту). Для всех практических вопросов это означает, что char var не может иметь значение больше 255. (хотя существуют системы, в которых байт имеет более 8 бит, и, таким образом, значение char может быть больше, но в настоящее время это редко )

Дополнительное предостережение заключается в том, что если char не определено как подписанное или без знака, оно может находиться в диапазоне от -128 до 127 или в диапазоне от 0 до 255. (конечно, при условии 8 бит на байт: -))

Между тем, таблица ASCII является 7-битной, что означает, что она охватывает диапазон от 0 до 127. Так что, если вас интересуют только символы ASCII, вы можете просто проверить, значение вашего char var находится в этом диапазоне. Не нужно приводить для сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...