Почему путчар, таппер, толуер и т. Д. Принимают вместо целого числа 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,

Другие вопросы по тегам