C, указатель, строка - PullRequest
       1

C, указатель, строка

0 голосов
/ 07 мая 2011
main()
{
  char *x="girl";
  int n,i;
   n=strlen(x);
  *x=x[n];
  for(i=0;i<n;i++)
  {
   printf("%s \n",x);
    x++;
  }
}

Какой вывод?
Пожалуйста, объясните вывод .......................
о / п:

irl
rl
l

Ответы [ 4 ]

4 голосов
/ 07 мая 2011

Вывод неопределенного поведения. Вы изменили строковый литерал.

1 голос
/ 07 мая 2011

Хотя результатом является неопределенное поведение, как сказал DeadMG, давайте предположим, что вы объявили x как char x[] = "girl".

Вы присваиваете 4 для n (поскольку длина слова "girl" равна 4), и вы присваиваете значение в x[4] для *x (что составляет x[0]), но это значение равно \ 0 '(нулевой терминатор)

Теперь вы зацикливаетесь и печатаете слово от x до следующего нулевого терминатора, но в первый раз первый символ является нулевым терминатором, поэтому вы ничего не получите. после этого вы печатаете слово из приращенного индекса.

g   i    r   l   \0

*x = x[4]:

\0   i    r    l   \0
^    ^    ^    ^
it1  it2  it3  it4      // << Where does x points to in each iteration of the for loop
1 голос
/ 07 мая 2011

Как уже отмечали другие, написанная программа имеет неопределенное поведение.

Если вы сделаете небольшое изменение:

char x[] = "girl";

тогда я считаю, что это законно и возможно объяснить. (РЕДАКТИРОВАТЬ: На самом деле есть еще проблемы с ним. Это int main(), и вы должны return 0; в конце. Вам также нужно #include <string.h>, потому что вы используете strlen, и #include <stdio.h>, потому что вы используете printf.)

Линия

*x = x[n];

устанавливает x[0] (то есть *x) в x[4] (что является символом окончания строки '\0'). Таким образом, первая строка для печати является пустой строкой, потому что самый первый символ - это терминатор строки.

Затем мы перебираем строку, по одному символу за раз, печатая подстроки:

irl
rl
l
0 голосов
/ 07 мая 2011

Код подозрительно. *x=x[n] пытается перезаписать буквальную "девушку", и эффект будет варьироваться между платформами и компиляторами. Правильнее это должно быть объявлено как:

const char *x = "girl";

и тогда он не будет (не должен) компилироваться.

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