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);
}
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
char x = 'FIO';
Ошибка.
Многосимвольные константы определяются реализацией, используются для жёсткой оптимизации, и в Visual C++ крайне ненадёжны. В GCC вроде бэ-мэ, но в любом случае преобразование в char 'FIO', которое должно занимать три байта, даст 'F' или 'O'.
Вам нужна не символьная константа, а строковая:
char x[] = "FIO";
И, соответственно, %s.

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

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

Войти через центр авторизации
Похожие вопросы