Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Nieudane porówanie dwóch stringów
Forum PHP.pl > Forum > Przedszkole
kabanek
witam,

mam dość dziwny problem. Napisałem taką oto funkcję:
  1. private function compareOutputs($userOutput, $output) {
  2. if ($userOutput == $output)
  3. return CODE_OK;
  4.  
  5. echo "Output: >>{$output}<<<br>";
  6. echo "userOutput: >>{$userOutput}<<<br>";
  7.  
  8. return CODE_WRONG;
  9. }


jak widać jako parametry podaję dwie zmienne (tekstowe), które mają zostać porównane. Problem polega na tym, że coś mi umyka i gdy podam dwie wartości, które są takie same, to funkcja mi się myli. Tak wiem... brzmi to dziwnie... Wartość stałej CODE_WRONG to 5, natomiast CODE_OK to 0. Po wykonaniu tej funkcji wyświetlam dodatkowo wynik działania tej funkcji. Oto przykładowy wynik (kod html)
  1. Output: >>world
  2. <<<br>userOutput: >>world
  3. <<<br>5

Jak widać i jedna i druga zmienna zawierają tekst "world" po czym jest jedna wolna linia. Dlaczego to nie przechodzi, kurne no... Przecież to podstawy są tiredsmiley.gif a błąd pewnie jakiś prosty dry.gif

EDIT:
w dodatku nie widzę tam żadnych białych znaków, które mogłyby się tam ukryć. Może to coś da, ale jedną wartość pobieram z bazy danych, natomiast druga to jest wynik działania jakiegoś programu zewnętrznego (tzn to co wyświetla). W bazie danych mam zapisany DOKŁADNIE taki tekst:
Cytat
world

natomiast program, który uruchamiam (napisany w c++) zawiera tylko taką instrukcję:
  1. cout<<"world"<<endl;


Program wywołuję funkcją exec mniej więcej tak:
  1. exec(Config::$Softlimit." -f 0 -t {$task['maxtime']} {$this->Program} < $inputFile", $output, $result);


Zmienna $output jest przekazywana jako 1 parametr, natomiast to co w bazie jako 2. Nie wiem co jeszcze mogę napisać...
Fifi209
zrób var_dump na obu zmiennych będziemy wiedzieli dokładnie czy są identyczne.
kabanek
napisałem tak:
  1. private function compareOutputs($output, $userOutput) {
  2. if ($userOutput == $output)
  3. return CODE_OK;
  4.  
  5.  
  6. for ($i = 0; $i < strlen($output); ++$i)
  7. if ($output[$i] != $userOutput[$i])
  8. echo "Roznia sie na $i miejscu<br>";
  9.  
  10. var_dump($output);
  11. var_dump($userOutput);
  12.  
  13. /*echo "Output: >>{$output}<<<br>";
  14. echo "userOutput: >>{$userOutput}<<<br>";
  15. echo "Dlugosci tekstow: ".strlen($output)." oraz ".strlen($userOutput)."<br>";*/
  16.  
  17. return CODE_WRONG;
  18. }

i jako wynik dostałem:
  1. Roznia sie na 5 miejscu
  2. string(6) "world " string(6) "world "

natomiast kod HTML wygląda tak:
  1. Roznia sie na 5 miejscu<br>string(6) "world
  2. "
  3. string(6) "world
  4. "


czyli chodzi o ten "enter"
tehaha
użyj funkcji http://php.net/manual/pl/function.rtrim.php przed porównaniem

@DOWN rzeczywiście:) już dałem dobry
kabanek
chyba link jest zły smile.gif

dalej to samo...
  1. private function compareOutputs($output, $userOutput) {
  2. rtrim($output);
  3. rtrim($userOutput);
  4.  
  5. if ($userOutput == $output)
  6. return CODE_OK;
  7.  
  8.  
  9. for ($i = 0; $i < strlen($output); ++$i)
  10. if ($output[$i] != $userOutput[$i])
  11. echo "Roznia sie na $i miejscu<br>";
  12.  
  13. var_dump($output);
  14. var_dump($userOutput);
  15.  
  16. //echo "Output: >>{$output}<<<br>";
  17. //echo "userOutput: >>{$userOutput}<<<br>";
  18. echo "Dlugosci tekstow: ".strlen($output)." oraz ".strlen($userOutput)."<br>";
  19.  
  20. return CODE_WRONG;
  21. }


i jako wyjście dostałem:
  1. Roznia sie na 5 miejscu
  2. string(6) "world " string(6) "world " Dlugosci tekstow: 6 oraz 6


kod HTML:
  1. Roznia sie na 5 miejscu<br>string(6) "world
  2. "
  3. string(6) "world
  4. "
  5. Dlugosci tekstow: 6 oraz 6<br>
outsider
funkcja, którą napisałeś, nie może się mylić, widocznie te wartości(na oko wyglądają tak samo) są różne, ostatnie znaki mogą mieć inny kod ASCII, jeśli możesz opuścić sprawdzanie białych znaków, to użyj funkcji trim(albo tą, co podał tehaha).
kabanek
właśnie nie mogę ich opuścić. Może do wina kodowania. W bazie ten tekst jest zapisany w latin1_swedish_ci a strona uruchamiana na linuksie, czyli pewnie wynik programu jest w UTF-8.
outsider
wyciągnij kod ostatniego znaku z tych 2 stringów funkcją ord. Następnie funkcja str_replace:
  1. $zmienna = str_replace(chr(65), chr(64), $zmienna);

zamiast chr(65) podaj numer tego znaku z bazy, a w drugim chr() podaj zamiennik UTF-8 smile.gif
Crozin
  1. rtrim($output);
  2. rtrim($userOutput);
[r|l]trim() jak każda normalna funkcja przyjmie jakąś wartość jako argument, skopiuje ją sobie i zwróci wynik, tu: ciąg z usuniętymi skrajnymi białymi znakami. Tak więcj:
  1. $a = rtrim($a);
A problemem są zapewne różne znaki dla końca linii (możliwe są: \r, \n i \r\n).
Tutaj masz przedstawione jak to wygląda: http://ideone.com/OPYIu
kabanek
Cytat(*OuTSideR* @ 6.11.2010, 19:59:20 ) *
wyciągnij kod ostatniego znaku z tych 2 stringów funkcją ord. Następnie funkcja str_replace:
  1. $zmienna = str_replace(chr(65), chr(64), $zmienna);

zamiast chr(65) podaj numer tego znaku z bazy, a w drugim chr() podaj zamiennik UTF-8 smile.gif

miałeś rację - w jednej zmiennej miał kod 10 a w drugiej 13.
outsider
Tylko pamiętaj, te znaki mogą wystąpić też w środku/na początku. Pokombinuj z innymi znakami zapisywanymi do bazy, pobierz je i porównaj z oryginałem(chodzi o białe znaki)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.