指针算法出错了

Ste*_*ail 1 c pointers pointer-arithmetic

我正在尝试使用a char *来存储一个字符串,因为指针指向给char定字符串中第一个的内存位置,我尝试使用指针arithmetic(ptr++)来移动到下一个char(因为它们是按顺序存储的) .但是,在我的示例程序中,"string"大小是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;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 6

问题是你正在调用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;
}
Run Code Online (Sandbox Code Playgroud)

为了进一步理解,想象每个循环迭代与您的初始代码:

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
Run Code Online (Sandbox Code Playgroud)

从本质上讲,您最终会打印(strlen/2) + 1字符,因为您将索引增加1并且每次循环迭代时将字符串的长度减少1.

  • 细节:"否则你在字符串末尾循环1次." - >在C"中_string_是由第一个空字符终止并包含第一个空字符的连续字符序列." 所以我会说"否则你就会循环到字符串的末尾." 用`<=`.无论它叫什么,`i <length`都是正确的测试. (2认同)