PoniższyJaka jest luka w tej logice porównywania ciągów znaków?
#include <iostream>
unsigned short int stringCompare (char * s1, char * s2)
{
// returns 1 if the character arrays s1 and s2 are equal;
// returns 0 otherwise
while (*s1 && (*s1++ == *s2++));
return (!(*s1) && !(*s2));
}
int main()
{
char str1 [] = "americano";
char str2 [] = "americana";
std::cout << stringCompare(str1,str2);
return 0;
}
wydruki 1
, czyli logika mojej funkcji jest nieprawidłowy. Chciałbym zrozumieć, dlaczego. Pozwól mi wyjaśnić moją logikę:
while (*s1 && (*s1++ == *s2++))
równocześnie zwiększa wskaźniki s1
i s2
tak długo, jak s1 nie jest równe '\0'
a wartość s1
wskazuje jest taka sama jak wartość s2
punkty. Ma to być krótszy sposób pisania i polegania na precedensie operatorów, aby go skrócić.
Oświadczenie
return (!(*s1) && !(*s2))
oznacza
"If s1 and s2 are both the null character, return true; otherwise return false"
bo jeśli ciągi są równe wtedy s1
i s2
będzie zarówno jako znak null po pętli while
.
Gdzie ja się mylę?
Czy zastanawiałeś się po prostu przechodząc przez algorytm? Bardzo szybko znajdziesz problem ... –