Jak używać String.substring?

Mam następujący kod, w którym requestLine jest zawsze puste i nie mogę zrozumieć, dlaczego. request zawiera nieprzetworzone żądanie HTTP i chcę uzyskać pierwszą linię żądania zawierającą metodę i adres URL.

boolean parseRequest(String* request) { int firstEOLAt = request->indexOf("\n"); if (firstEOLAt < 0) return false; Serial.println(firstEOLAt); String requestLine = request->substring(0, firstEOLAt); Serial.println(requestLine); // ...rest of the parsing will go here... return true; } 

Pierwsza println zwraca 26, tak jak można by oczekiwać dla ciągu "GET /ilyen_nincs HTTP/1.1" (25 znaków), ale potem requestLine jest zawsze puste. Zastanawiam się, dlaczego?

Odpowiedź

GET /ilyen_nincs HTTP/1.1\n ma 26 znaków, więc indeksy łańcuchów mieszczą się w przedziale od 0 do 25. Ponieważ drugi argument w substring(0, firstEOLAt); przekracza indeks końcowy ciągu, to nieoczekiwane zachowanie zgodnie z dokumentacją i pobranie pustego ciągu.

Uwaga: należy upewnij się, że wartości indeksu mieszczą się w długości ciągu, inaczej otrzymasz nieprzewidywalne wyniki. Ten rodzaj błędu może być szczególnie trudny do znalezienia w drugim wystąpieniu funkcji substring (), jeśli pozycja początkowa jest mniejsza niż długość ciągu, ale pozycja końcowa nie jest równa „t”.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *