我正在尝试使用char *
存储字符串,并且由于指针指向给定字符串的第一个char
的内存位置,因此我尝试使用指针算术({{ 1}})移至下一个字符(因为它们是按顺序存储的)。但是,在我的示例程序中,“字符串”的大小为22,但是当我尝试运行如下所示的for循环时,它仅运行12次。知道为什么吗?我错过了关于指针算术如何工作的重要信息吗?
ptr++
答案 0 :(得分:6)
问题是您在每次条件检查(效率低下)时都调用strlen(strVar)
,并且还修改了strVar
同时指向的位置。将初始大小存储在变量中,然后将索引与初始大小(而不是字符串的剩余长度)进行比较。另外,由于从0开始,您可能希望在条件中使用<
而不是<=
。否则,由于C中的字符串,您还需要遍历终止的NULL
字符。终止符为空。
#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
基本上,由于每次循环迭代将索引增加1并将字符串的长度减少1,因此最终将打印(strlen/2) + 1
字符。