Мне нужно знать, как выходные данные были сгенерированы этим исходным кодом

#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? Объясните подробнее, сэр … выходные данные для меня все еще не определены.