2013-09-17 4 views
0

Выходной сигнал программы ниже 6. Я не могу понять, почему. Когда я прослеживаю его вручную, я получаю 5.Указатели: почему выход равен 6?

#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); 
} 
+0

не должен быть выход в любом случае 2? или 7? требования к тому, что вы ожидали? Я не понимаю, как вы ожидаете? – dhein

+0

@Zaibis './a.out count = 6' –

+4

move strlen (p1) before for. на каждой итерации strlen возвращает число меньше на единицу - потому что оно возвращает число символов из char, на котором p1 указывает на \ 0. ваш за будет выполняться всего 5 раз. –

ответ

0

Ваша программа останавливается, когда i>strlen(p1) потому что вы меняете p1 каждый раз, когда вы делаете *p1++.

Когда он вычисляет условие, strlen возвращает размер из las char.

Если вы сохраняете значение в переменной в начале (перед вашим циклом), оно должно работать.

Во всяком случае, попытаться избежать арифметику указателей ...

9

if(*p1++ == *p2++) читает как p1 и p2 посимвольно. Когда персонажи будут одинаковыми, он увеличится на count на 5, иначе он уменьшит его на 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 
+1

Спасибо, я понял :) – user2787790

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.

Смежные вопросы