代码之家  ›  专栏  ›  技术社区  ›  Stelios Papamichail

指针运算出错

  •  1
  • Stelios Papamichail  · 技术社区  · 7 年前

    我在试着用 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 回复  |  直到 7 年前
        1
  •  6
  •   John    7 年前

    问题是你打电话来 strlen(strVar) strVar 同时点。将初始大小存储在变量中,并将索引与初始大小(而不是字符串的剩余长度)进行比较。另外,你可能想用 < 而不是 <= NULL 字符,因为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
    

    基本上,你最终会打印出来 (strlen/2) + 1