Каковы различия при приведении от целого к массиву символов следующими способами в C? - PullRequest
1 голос
/ 11 апреля 2020

Я преобразую целые числа в массивы символов следующими способами, но я не понимаю, в чем различия при использовании печати (поскольку в обеих я печатаю массивы символов?):

// The desired output is always "65" literal and NOT "A"
// First way:
char a = (char)65;
printf("%d", a); // "65"


// Second way:
char str[3];
sprintf(str, "%d\n", 65);
printf("str: %s\n", str); // "65"

Однако следующие способы возвращают ошибки:

// Note that I am exchanging only the format in the printf function
printf("%s", a); // Error
printf("str: %d\n", str); // Error

1 Ответ

2 голосов
/ 11 апреля 2020

Вы используете недопустимые спецификаторы преобразования для объектов, выведенных в вызовах printf.

В этом вызове

printf("%s", a);

спецификатор преобразования %s ожидает аргумент типа char * пока вы передаете объект типа char.

В этом вызове

printf("str: %d\n", str);

спецификатор преобразования %d ожидает аргумент типа int во время передачи выражение типа char *, в которое неявно преобразуется указатель массива.

Как, например, для этого фрагмента кода

char a = (char)65;
printf("%d", a);

, здесь приведена целочисленная константа 65 для типа char является избыточным.

Вы можете написать

char a = 65;

При вызове printf вы используете спецификатор преобразования %d, который выводит символ в виде целого числа. То есть он выводит внутреннее представление символа ASCII «A». Если вы будете использовать спецификатор преобразования %c вместо %d, в качестве результата вы получите символ 'A'.

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