Указатель неверен - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь использовать char * для хранения строки, и так как указатель указывает на ячейку памяти первой char данной строки, я попытался использовать арифметику указателя (ptr++) для перемещения на следующий символ (так как они хранятся последовательно). Тем не менее, в моем примере программы размер "строки" равен 22, но когда я пытаюсь запустить цикл for, как показано ниже, он запускается только 12 раз. Есть идеи почему? Я пропустил что-то важное о том, как работает арифметика указателей?

#include <stdio.h>

int main(void) {
  char *strVar = "testfordifferentlength";
  int i,timesCalled=0;
  printf("\nLength = %d\n\n",strlen(strVar));
  for(i=0;i <= strlen(strVar);i++){
    printf("%c",*strVar);
    strVar++;
    timesCalled++;
  }
  printf("\n\nFor loop run %d times!\n",timesCalled);
  return 0;
}

1 Ответ

0 голосов
/ 07 ноября 2018

Проблема в том, что вы вызываете strlen(strVar) при каждой проверке состояния (неэффективно как есть), а также изменяете, где strVar указывает одновременно. Сохраните начальный размер в переменной и сравните ваш индекс с начальным размером, а не с оставшейся длиной строки. Кроме того, вы, вероятно, захотите использовать < вместо <= в вашем состоянии, поскольку вы начинаете с 0. В противном случае вы также выполняете итерацию по завершающему символу NULL, поскольку строки в C заканчиваются нулем.

#include <stdio.h>

int main(void) {
  char *strVar = "testfordifferentlength";
  int i, timesCalled = 0, length = strlen(strVar);
  printf("\nLength = %d\n\n",length);
  for(i = 0; i < length; i++){
    printf("%c", *strVar);
    strVar++;
    timesCalled++;
  }
  printf("\n\nFor loop run %d times!\n", timesCalled);
  return 0;
}

Для дальнейшего понимания представьте каждую итерацию цикла с вашим исходным кодом:

i = 0, strVar = "testfordifferentlength", length = 22, output is 't'
i = 1, strVar = "estfordifferentlength", length = 21, output is 'e'
i = 2, strVar = "stfordifferentlength", length = 20, output is 's'
i = 3, strVar = "tfordifferentlength", length = 19, output is 't'
...
i = 11, strVar = "erentlength", length = 11, output is 'e'
And this point your loop ends

По сути, вы закончите печатью (strlen/2) + 1 символов, так как вы увеличиваете свой индекс на 1 и уменьшаете длину строки на 1 на каждой итерации цикла.

...