Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针运算出错_C_Pointers_Pointer Arithmetic - Fatal编程技术网

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