оператор индекса массива для счетчика цикла - PullRequest
1 голос
/ 13 ноября 2010

Я изучаю C. В следующем коде почему замена "* ptr_str" на "ptr_str [i]" в усечении цикла for?

/* 13L01.c: Initializing strings */
#include <stdio.h>
main()
{
 char str1[] = {'A', ' ',
 's', 't', 'r', 'i', 'n', 'g', ' ',
 'c', 'o', 'n', 's', 't', 'a', 'n', 't', '\0'};
  char str2[] = "Another string constant";
  char *ptr_str;
  int i;

  /* print out str2 */
  for (i=0; str1[i]; i++)
      printf("%c", str1[i]);
      printf("\n");
  /* print out str2 */
  for (i=0; str2[i]; i++)
      printf("%c", str2[i]);
      printf("\n");
   /* assign a string to a pointer */
   ptr_str = "Assign a strings to a pointer.";
   for (i=0; *ptr_str; i++)
       printf("%c", *ptr_str++);
   return 0;

}

Ответы [ 3 ]

2 голосов
/ 13 ноября 2010
   // A, ok
   while (*ptr_str)
       printf("%c", *ptr_str++);

   // B, also ok
   for (i=0; ptr_str[i]; i++)
       printf("%c", ptr_str[i]);

   // C, works but ugly
   for (i=0; *ptr_str; i++)
       printf("%c", *ptr_str++);

C - это ваша форма, она несовершенна, потому что я здесь ничего не делаю, поэтому A - улучшенная версия.Если вы хотите использовать i, сделайте это как B. Если вы используете и i и ptr_str, и увеличиваете их обоих в цикле, ничего хорошего не произойдет.Увеличивайте одно или другое.

2 голосов
/ 13 ноября 2010

Поскольку вы продвигаете ptr_str, а затем обрабатываете его как массив и проверяете, указывает ли он на NULL на i-м члене. Вы в основном тестируете, если ptr_str[i+i] равно NULL вместо ptr_str[i].

1 голос
/ 13 ноября 2010

Ваш вопрос немного неясен, но я думаю, что у меня есть:

В следующем коде почему замена "* ptr_str" на "ptr_str [i]" в усечении цикла for?

Я думаю, вы имеете в виду изменить это:

for (i=0; *ptr_str; i++)
    printf("%c", *ptr_str++);
return 0;

к этому:

for (i=0; ptr_str[i]; i++)
    printf("%c", *ptr_str++);
return 0;

Второй усекается, потому что вы продвигаетесь i и ptr_str, поэтому измененная начальная позиция ptr_str плюс измененная начальная позиция i заканчивает тем, что обрезает вас слишком рано (или, что еще хуже, имеет нечетное количество символов и переполняет данные, которые не ваши). Второй пример, который усекает, эквивалентен:

for (i=0; ptr_str[i * 2]; i++)
    printf("%c", ptr_str[i]);
return 0;

Теперь вы видите, почему оно усекается?

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