while(* p ++)循环不打印字符串的第一个元素

时间:2014-06-20 19:17:47

标签: c pointers

我在一个指针变量中存储了一个字符串,该变量在堆部分中有内存。当我逐个字符地打印字符串时,跳过第一个元素。

示例:如果char *p="hello"使用while(*p++)循环'h'逐字符打印,则会跳过并输出"ello",是否可以解释一下?

  #include <stdio.h>
  #include <stdlib.h>
  int main() 
  {
    char *p=(char*)malloc(sizeof(char)*20);
    printf("enter string\n");
    scanf("%s",p);
    while(*p++)// value is assign and address is increased
    {
      printf("%c",*p);//why first character is skipped??
    }
    return 0;
  }

4 个答案:

答案 0 :(得分:4)

要查看第一个字母,请将*p更改为p[-1],因为p++已经增加p,所以当您第一次使用*p时, p已经指向第二个字母(索引为1)。

还有很多其他方法可以解决它,例如

for (; *p; ++p) {
  putchar(*p);
}

答案 1 :(得分:2)

因为while(*p++)在循环开始后立即递增值。到达printf语句时,p已经递增。

p = 0
while(p++) {   // p = p + 1
   printf('%d', p);  // p = 1 when this executes
}

答案 2 :(得分:1)

在此语句后{p> while(*p++) p递增并向前移动。因此,printf() p已指向第二个字符。

答案 3 :(得分:0)

while(*p++)行将检查*p的值,然后在进入循环体之前增加p。您可以使用for循环

来改进代码
for ( ; *p; p++ )
    printf( "%c", *p );

或在使用它之后递增指针,在循环体

while(*p)
    printf( "%c", *p++ );