0

下面程序的输出是6。我不知道为什么。当我用手追踪它时,我得到了5.

#include<stdio.h>
#include<conio.h>

main()
{
    int i,count=0; 
    char *p1="abcdefghij"; 
    char *p2="alcmenfoip"; 

    for(i=0;i<=strlen(p1);i++) { 
        if(*p1++ == *p2++) 
            count+=5; 
        else 
            count-=3; 
    } 
    printf("count=%d",count); 
}
4

3 回答 3

9

if(*p1++ == *p2++)p1正在逐字阅读p2。当字符相同时,它会增加count5,否则它会减少3。但是,还有一点你没有注意:strlen(p1)每次迭代都会不同,因为p1会发生变化。因此,在每次迭代中,您还需要检查它的值。

p1   p2 count   i   strlen (before entering into the loop body)
a    a   5      0   10
b    l   2      1   9
c    c   7      2   8
d    m   4      3   7
e    e   9      4   6
f    n   6      5   5  <- No more - this is the last one
于 2013-09-17T13:37:16.410 回答
2

这里的诀窍是,strlen(p1)每次迭代都会改变。所以循环条件去

0 <= 10  +5
1 <= 9   -3
2 <= 8   +5 
3 <= 7   -3
4 <= 6   +5
5 <= 5   -3

所以相等的字符是a, c, e, 上面显示为 +5。总数为 6。

于 2013-09-17T13:37:17.843 回答
0

你的程序在什么时候停止,i>strlen(p1)因为你每次都在改变 p1 *p1++

当它计算条件时 strlen 从 las char 返回大小。

如果您在开始时(循环之前)将值存储在变量中,它应该可以工作。

无论如何,尽量避免指针算术......

于 2013-09-17T13:37:06.933 回答