if(!(*t))
предполагает наличие нулевого символа перед первым символом в строке. Это не только неверное предположение, но и попытка доступа к памяти за пределами массива.
Кроме того, while(*t-- == *s--)
... Что происходит, когда 2 строки идентичны или t
длиннее s
?
Вот простое решение:
int strend(char *s, char *t) {
if (s == NULL || t == NULL) return Not_occured;
size_t s_len = strlen(s);
size_t t_len = strlen(t);
if (t_len <= s_len) {
return 0 == strcmp(&s[s_len - t_len], t) ? occured : Not_occured;
}
return Not_occured;
}
Поскольку теперь стало яснее, что исходный вопрос касается операций до и после исправления, я обновил.
Во-первых, поймите разницу между ними:
int x = 1;
printf("%d", x++);
// Prints 1 because x is evaluated before the inc
x = 1;
printf("%d", ++x);
// Prints 2 because x is evaluated after the inc
Теперь некоторые операторы имеют приоритет:
postfix > dereference
prefix == dereference, right-to-left assoc.
Что происходит с *s++
:
s++
оценивается - сначала сохраняется текущее значение s
(назовем это s0
), затем увеличивается s
s0
разыменовано
Это то же самое, что и
char *s0 = s;
s += 1;
char c = *s0;
Что происходит с *++s
:
s
увеличивается
s
разыменовано
Это то же самое, что и
s += 1;
char c = *s;
Надеюсь, это имеет смысл.