C 指针运算出错
我试图使用C 指针运算出错,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,我试图使用char*存储字符串,由于指针指向给定字符串的第一个char的内存位置,我尝试使用指针算法(ptr++)移动到下一个字符(因为它们是按顺序存储的)。然而,在我的示例程序中,“字符串”的大小是22,但是当我尝试运行下面所示的for循环时,它只运行了12次。知道为什么吗?我是否错过了一些关于指针运算如何工作的重要内容 #include <stdio.h> int main(void) { char *strVar = "testfordifferentlength";
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;
}
#包括
内部主(空){
char*strVar=“testfordifferentlength”;
int i,timecalled=0;
printf(“\n长度=%d\n\n”,strlen(strVar));
对于(i=0;i问题在于,您在每次条件检查时都要调用strlen(strVar)
(效率很低),并同时修改strVar指向的位置。将初始大小存储在变量中,并将索引与初始大小进行比较,而不是与字符串的剩余长度进行比较。此外,您可能希望使用。问题是在每次条件检查时都调用strlen(strVar)
(目前效率低下),并同时修改strVar
指向的位置。将初始大小存储在变量中,并将索引与初始大小进行比较,而不是与字符串的剩余长度进行比较。此外,您可能希望使用这是正确的答案。您可以通过一个示例来更清楚地说明问题。只需使用strVar
类似迭代器的指针char*p=strVar;while(*p!='\0'){…;p++;
使代码更简单。详细信息:“否则,您将在字符串末尾循环1次。”-->C中“字符串是以第一个空字符结尾并包含第一个空字符的连续字符序列。”所以我要说“否则,您将循环到字符串的末尾。”对于@John,感谢您给出如此清晰的答案。我现在明白我做错了什么,再次感谢您!这是正确的答案。您可以通过一个示例来更清楚地说明问题。只需像迭代器char*p=strVar;一样使用strVar
指针即可(*p!='\0'){…;p++;
使代码更简单。详细信息:“否则,您将在字符串末尾循环1次。”-->C语言中“字符串是以第一个空字符结尾并包含该空字符的连续字符序列。”因此我会说“否则,您将循环到字符串末尾。”。“有了@John,谢谢你这么清楚的回答。我现在明白我做错了什么,再次感谢你!你到底想在这里实现什么或学到什么?还有一件事没有提到,那就是你不想做printf(“%c”)
在一个空终止符上你到底想实现什么或学习什么?另一件没有提到的事情是你不想在一个空终止符上执行printf(“%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