指针运算出错

时间:2018-11-06 22:57:24

标签: c pointers pointer-arithmetic

我正在尝试使用char *存储字符串,并且由于指针指向给定字符串的第一个char的内存位置,因此我尝试使用指针算术({{ 1}})移至下一个字符(因为它们是按顺序存储的)。但是,在我的示例程序中,“字符串”的大小为22,但是当我尝试运行如下所示的for循环时,它仅运行12次。知道为什么吗?我错过了关于指针算术如何工作的重要信息吗?

ptr++

1 个答案:

答案 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字符。