Почему путчар, таппер, толуер и т. Д. Принимают вместо целого числа int?
В C строки - это массивы char (char *
) и символы обычно хранятся в char
, Я заметил, что некоторые функции из libC принимают в качестве аргумента целые числа вместо символа.
Например, давайте возьмем функции toupper()
а также tolower()
что оба используют int
, На странице руководства написано:
Если c не является значением без знака или EOF, поведение этих функций не определено.
Я думаю, что с int
, toupper
а также tolower
умеют иметь дело с unsigned char
а также EOF
, Но по факту EOF
на практике (есть ли какое-либо правило относительно его значения?) значение, которое может быть сохранено с char
и так как эти функции не преобразуются EOF
в другое, мне интересно, почему toupper
не просто принимает символ в качестве аргумента.
В любом случае, почему мы должны принимать что-то, что не является символом (например, EOF)? Может ли кто-нибудь предоставить мне соответствующий вариант использования?
Это похоже на fputc
или же putchar
, что также взять int
это превращается в unsigned char
тем не мение.
Я ищу точные мотивы для этого выбора. Я хочу быть убежденным, я не хочу отвечать, что я не знаю, если кто-то спросит меня однажды.
3 ответа
С11 7,4
Заголовок
<ctype.h>
объявляет несколько функций, полезных для классификации и сопоставления символов. Во всех случаях аргументом является int, значение которого должно быть представлено как беззнаковый символ или должно равняться значению макроса EOF. Если аргумент имеет любое другое значение, поведение не определено.
С11 7.21.1
EOF
который расширяется до целочисленного константного выражения, с типом int и отрицательным значением, ...
Стандарт C явно заявляет, что EOF всегда является int с отрицательным значением. И кроме того, подпись по умолчанию char
Тип определяется реализацией, поэтому он может быть без знака и не может хранить отрицательное значение:
С11 6.2.5
Если элемент базового набора символов выполнения хранится в объекте char, его значение гарантированно будет неотрицательным. Если какой-либо другой символ хранится в объекте char, результирующее значение определяется реализацией, но должно находиться в диапазоне значений, которые могут быть представлены в этом типе.
BITD метод кодирования включает в себя:
/* example */
int GetDecimal() {
int sum = 0;
int ch;
while (isdigit(ch = getchar())) { /* isdigit(EOF) return 0 */
sum *= 10;
sum += ch - '0';
}
ungetc(ch, stdin); /* If c is EOF, operation fails and the input stream is unchanged. */
return sum;
}
ch
со значением EOF, то может быть использован в различных функциях, таких как isalpha()
, tolower()
,
Этот стиль вызвал проблемы с putchar(EOF)
который я подозреваю, сделал так же, как putchar(255)
,
Метод не рекомендуется сегодня по различным причинам. Различные модели, такие как следующие, являются предпочтительными.
int GetDecimal() {
int ch;
while (((ch = getchar()) != EOF)) && isdigit(ch)) {
...
}
...
}
Если c не является значением без знака или EOF, поведение этих функций не определено.
Но EOF
отрицательный int
в C и на некоторых платформах (привет ARM!) есть char
такой же как unsigned char
,