alexey_ma
Не могу согласиться

Проверка успешная будет в том случае, когда *p1 окажется равным *p2. Алгоритм ведь основан на том, что в случае успеха каждый раз будет срабатывать брейк:
if (*p1 == *p2) break;
Выход из алгоритма произойдет:
1. Когда (*p1 == *p2) и (*p2 == '\0') - это случай, когда все проверки были успешными. На выходе получим 0.
2. Когда брейк не сработал и (*p2 == '\0') - проверка не удалась, на выходе разность - какой знак у нее мы не знаем, но это точно не 0.