b3rgin
@b3rgin
JavaScript Junior

Почему у меня %c выводит а %s выбивает ошибку?

Я пишу код, и почему то если %s заменить на %с выводит норм, а если %s даёт вот такую ошибку :
Вызвано исключение: нарушение доступа для чтения.
it было 0x4F.

Помогите пожалуйста решить, хз чё это такое, скорее всего что то елементарное, но я хз
#include <stdio.h>
#include <conio.h> //підключення бібліотеки текстового інтерфейсу
#include <locale>
void main()
{
	setlocale(LC_ALL, "Russian");

	char b = '|';
	char n = '#';
	char x = 'FIO';
	char y = 'kurs';
	char z = 'grup';
	char f;
	int k;
	char g;
	printf_s("\n%c%c%c%10s%10c", b,n,b,x,b);
}
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
char x = 'FIO';
Ошибка.
Многосимвольные константы определяются реализацией, используются для жёсткой оптимизации, и в Visual C++ крайне ненадёжны. В GCC вроде бэ-мэ, но в любом случае преобразование в char 'FIO', которое должно занимать три байта, даст 'F' или 'O'.
Вам нужна не символьная константа, а строковая:
char x[] = "FIO";
И, соответственно, %s.

А как действует printf и любая другая функция с переменным числом аргументов? Эти аргументы сваливаются навалом в область памяти, которая называется «стек вызовов», и printf начинает этот навал разбирать. Чтобы сдвинуло указатель на один байт и сказало: это char — и используется формат %c. Разумеется, неверный формат приведёт к неверной интерпретации типа данных и отказу на одной или всех платформах.
%c — в памяти лежит один байт, интерпретировать его как один символ
%s — в памяти лежит указатель на строку, заканчивающуюся нулём, 4/8 байтов. (Все массивы в исходном Си куда бы то ни было передаются как указатели.)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
.White Code Санкт-Петербург
от 420 000 до 480 000 ₽
.White Code Санкт-Петербург
от 250 000 до 400 000 ₽