Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Nieudane porówanie dwóch stringów
kabanek
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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ć...

Ten post edytował kabanek 4.11.2010, 20:45:19
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


zrób var_dump na obu zmiennych będziemy wiedzieli dokładnie czy są identyczne.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
kabanek
post
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
tehaha
post
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


użyj funkcji http://php.net/manual/pl/function.rtrim.php przed porównaniem

@DOWN rzeczywiście:) już dałem dobry

Ten post edytował tehaha 5.11.2010, 17:03:57
Go to the top of the page
+Quote Post
kabanek
post
Post #5





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
outsider
post
Post #6





Grupa: Zarejestrowani
Postów: 267
Pomógł: 36
Dołączył: 8.08.2008

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
kabanek
post
Post #7





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
outsider
post
Post #8





Grupa: Zarejestrowani
Postów: 267
Pomógł: 36
Dołączył: 8.08.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował *OuTSideR* 6.11.2010, 20:00:01
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
kabanek
post
Post #10





Grupa: Zarejestrowani
Postów: 35
Pomógł: 2
Dołączył: 25.06.2009
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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.

Ten post edytował kabanek 7.11.2010, 18:18:06
Go to the top of the page
+Quote Post
outsider
post
Post #11





Grupa: Zarejestrowani
Postów: 267
Pomógł: 36
Dołączył: 8.08.2008

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 10:17