我在一个指针变量中存储了一个字符串,该变量在堆部分中有内存。当我逐个字符地打印字符串时,跳过第一个元素。
示例:如果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;
}
答案 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)
while(*p++)
p
递增并向前移动。因此,printf()
p
已指向第二个字符。
答案 3 :(得分:0)
第while(*p++)
行将检查*p
的值,然后在进入循环体之前增加p
,。您可以使用for
循环
for ( ; *p; p++ )
printf( "%c", *p );
或在使用它之后递增指针,在循环体
中while(*p)
printf( "%c", *p++ );