指针运算出错
Pointer arithmetic gone wrong
我正在尝试使用 char *
来存储字符串,并且由于指针指向给定字符串的第一个 char
的内存位置,我尝试使用指针算法 ( ptr++
) 移动到下一个字符(因为它们是按顺序存储的)。但是,在我的示例程序中,"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;
}
问题是您在每次条件检查时都调用了 strlen(strVar)
(效率低下),同时还修改了 strVar
指向的位置。将初始大小存储在变量中,并将索引与初始大小进行比较,而不是将字符串的剩余长度进行比较。此外,您可能希望在您的条件中使用 <
而不是 <=
,因为您从 0 开始。否则,您还会迭代终止 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
个字符,因为您在每次循环迭代时将索引增加 1 并将字符串的长度减少 1。
我正在尝试使用 char *
来存储字符串,并且由于指针指向给定字符串的第一个 char
的内存位置,我尝试使用指针算法 ( ptr++
) 移动到下一个字符(因为它们是按顺序存储的)。但是,在我的示例程序中,"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;
}
问题是您在每次条件检查时都调用了 strlen(strVar)
(效率低下),同时还修改了 strVar
指向的位置。将初始大小存储在变量中,并将索引与初始大小进行比较,而不是将字符串的剩余长度进行比较。此外,您可能希望在您的条件中使用 <
而不是 <=
,因为您从 0 开始。否则,您还会迭代终止 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
个字符,因为您在每次循环迭代时将索引增加 1 并将字符串的长度减少 1。