Проблема в том, что вы вызываете 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 на каждой итерации цикла.