【问题标题】:Pointer arithmetic gone wrong指针运算出错
【发布时间】:2019-04-10 09:42:14
【问题描述】:

我正在尝试使用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;
}

【问题讨论】:

  • 您在这里真正想要实现或学习什么?
  • 另一件尚未提及的事情是您不想在空终止符上执行printf("%c"

标签: c pointers pointer-arithmetic


【解决方案1】:

问题是您在每次条件检查时都调用strlen(strVar)(效率低下),并且同时修改strVar 指向的位置。将初始大小存储在变量中,并将索引与初始大小进行比较,而不是字符串的剩余长度。此外,您可能希望在您的条件下使用 &lt; 而不是 &lt;=,因为您从 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。

【讨论】:

  • 这是正确的答案。您可以通过插图更清楚地说明问题。
  • 只需像迭代器一样使用strVar 指针char *p = strVar; while (*p != '\0') { ...;p++; 使代码更简单。
  • 详细信息:“否则,您将在字符串末尾循环 1 次。” --> 在 C 中,“string 是一个连续的字符序列,由第一个空字符终止并包括第一个空字符。”所以我会说“否则你会循环到字符串的末尾。”与&lt;=。不管叫什么,i &lt; length 都是正确的测试。
  • @John 谢谢你这么清楚的回答。我现在明白我做错了什么,再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多