#c
#c
Вопрос:
#include <stdio.h>
int main()
{
char c[]="GATE2016";
char *p = c;
printf("%s",p p[3] - p[1]);
}
Выходные данные для приведенного выше исходного кода являются
2016
Я не имею ни малейшего представления, как это произошло. Также, когда я редактирую
char c[]="asdf2016"
показанный результат является
`
Кто-нибудь может мне помочь в этом?
Комментарии:
1. Выходные данные определяются реализацией, поскольку не все реализации C используют ASCII.
2. объясните подробнее.. Я хочу знать причину вывода.
3.
p[3] = 'E'
,p[1] = 'A'
,'E' - 'A' = 4
,p 4 = "2016"
.4. тогда почему выходные данные изменились, когда я написал char c []=»asdf2016″
Ответ №1:
Прежде всего, p
это указатель на первый элемент массива c
, поэтому всякий раз, когда вы передаете p
один, он будет вести себя точно так же, как если бы вы передавали c
, то есть он будет считываться с адреса p
до тех пор, пока не достигнет строкового терминатора ''
.
Теперь некоторые говорят, что это зависит от того, использует ли ваш код ASCII или EBCDIC или любую другую кодировку. Хотя это и не так, ваш код не зависит непосредственно от этого. Важно то, что в случае вашей строки "GATE2016"
символы 'A'
и 'E'
(к которым обращаются в этом причудливо выглядящем коде при вызове printf) следуют один за другим, и что вычитание A из E дает 4, вы поймете почему. Ради этого примера я буду использовать ASCII.
В ASCII символы 'A'
равны 65, а 'E'
равны 69. Итак, в строке
printf("%s",p p[3] - p[1]);
то, что вы на самом деле делаете, можно перевести как
printf("%s",p 'E' - 'A');
или просто
printf("%s",p 69 - 65);
который может быть дополнительно упрощен как
printf("%s",p 4);
Теперь, поскольку "%s"
формат printf ожидает указатель на начало строки, то, что вы фактически передаете в качестве аргумента в этом случае, это адрес p
4 (который, поскольку это указатель, сдвигается на 4 слота памяти), так что в конечном итоге вы получаете позицию [4] в качестве начала строки ( p 4 == amp;p[4]
), printf начинает считывать вашу строку с позиции 4, которая содержит 2 из 2016. Оттуда он просто считывается до тех пор, пока не достигнет ''
вашей строки и просто распечатает 2016, что также объясняет, почему это не работает с "asdf"
.
Просто помните, что символы в C — это просто числа, и что в ASCII запись 'A'
точно такая же, как запись числа 65
.
Комментарии:
1. когда почему вывод «‘ когда я использую ‘char c []=»asdf2016»?
2. когда почему вывод ‘ ` ‘, когда я использую ‘ char c []=»asdf2016’?
3. Потому что тогда вы вычитаете
's'
(= 115) из'f'
(= 102), результат равен -13, то есть вы пытаетесь получить доступ к чему-либо из массива, что, насколько я знаю, является неопределенным поведением, поэтому оно может печатать что угодно.
Ответ №2:
Что ж,
Прежде всего, переменная p — это адрес, а также c. Во-вторых, символы по-прежнему представлены как числа внутри. Я предполагаю, что в вашей реализации код ASCII определяет, каким является это представление, поэтому в ASCII:
‘E’ = 69 и ‘A’ = 65, подробнее смотрите в ascii-коде
p[3] = 'E'
p[1] = 'A'
в вашей строке и так, чтобы printf фактически печатал с p 4, то есть с p[4] до конца.
Комментарии:
1. В C нет требования к реализации использовать ASCII, а не, скажем, EBCDIC.
2. тогда почему выходные данные изменились, когда я написал
3. Тогда почему выходные данные изменились, когда я написал char c []=»asdf2016″
4. Потому что, если вы посмотрите на f-s, это будет отрицательное число, и выходные данные будут неопределенными, поскольку они выходят за пределы массива
5. что такое f-s? Объясните подробнее, сэр … выходные данные для меня все еще не определены.