Próbuję przekonwertować niektóre znaki na typy liczbowe, ale niektóre z nich mogą nie być zakończonymi znakami null łańcuchami. A więc czy strtol, strtoll, strtod są bezpieczne dla tych ciągów, które nie są zakończone znakiem null?są strtol, strtoll, strtod bezpieczne dla jakichkolwiek znaków, nawet nie zakończone znakiem null?
są strtol, strtoll, strtod bezpieczne dla jakichkolwiek znaków, nawet nie zakończone znakiem null?
Odpowiedz
nr
Jeśli tablica znaków nie jest zakończony znakiem null, następnie nie jest to ciąg. Jeśli którakolwiek z funkcji strto*()
zostanie przekazana jako argument, który nie wskazuje na ciąg znaków, zachowanie jest niezdefiniowane.
Nawiązując do latest draft normy ISO 2011 C:
7.1.1 Definicje terminów:
ciąg jest ciągła sekwencja znaków zakończone i tym pierwszym wartość null postać.
7.1.4 Korzystanie z funkcji bibliotecznych:
Jeśli argument do funkcji ma nieprawidłową wartość (na przykład jako wartość poza dziedziną funkcji lub wskaźnik poza adresem spacja programu lub wskaźnik zerowy lub wskaźnik do niemodyfikowalnego miejsca przechowywania, gdy odpowiedni parametr nie jest const-kwalifikowany) lub typ (po promocji) nieoczekiwany przez funkcję ze zmienną liczbą argumentów, zachowanie jest niezdefiniowane.
7.22.1.3 W strtod, strtof i strtold funkcje:
strtod, strtof i strtold funkcje konwersji początkowej części łańcucha wskazano przez nptr na podwójne, float i długie podwójne reprezentowanie odpowiednio.
(podkreślenie dodane)
Więc argument, że nie wskazuje na sznurku jest poza dziedziną funkcji.
Prawdopodobnie uciekniesz, jeśli tablica zawiera coś w rodzaju { '1', '2', '3', 'x', 'y', 'z' }
, ponieważ nie musi skanować poza wartością x
, która kończy żądaną wartość, ale zachowanie jest jawnie niezdefiniowane.
Jeśli chcesz korzystać z tych funkcji, powinieneś, jeśli to konieczne, skopiować tablicę do innego bufora i jawnie anulować ją samodzielnie.
Tak długo, jak twoje wejście jest zakończone w jakiś sposób, co zdecydowanie nie jest poprawną cyfrą, przetwarzanie zatrzyma się i nie powinno iść szczęśliwie do odczytu pamięci, dopóki nie znajdzie pierwszego NUL-a.
Więc myślę, że wszystko w porządku.
- 1. C++ zakończone znakiem null wyprowadzenie tablicy char znaków
- 2. Dlaczego łańcuchy zakończone znakiem NUL? Lub: null zakończone vs. przechowywania znaków + długość
- 3. Czy java definiuje łańcuch jako zakończone znakiem null?
- 4. Czy standardowe pliki tekstowe są zakończone NULL?
- 5. są bezpieczne czy nie?
- 6. Podwójny łańcuch zakończony znakiem Null
- 7. Czy literały łańcuchowe zakończone znakiem zerowym zawierają dodatkowy terminator o wartości NULL?
- 8. Czy char * argumenty argv [] w głównej null są zakończone?
- 9. Uzyskiwanie łańcucha zakończonego znakiem null z System.Text.Encoding.Unicode.GetString
- 10. MySQL - NULL bezpieczne NIE równy operator
- 11. Jak mogę wyprowadzać łańcuchy zakończone znakiem NUL w Awk?
- 12. Wykrywanie błędu strtol
- 13. Czy metody SmtpClient.SendMailAsync są bezpieczne dla wątków?
- 14. Czy single Kotlina są bezpieczne dla wątków?
- 15. Czy generatory są bezpieczne dla wątków?
- 16. Nie można uruchomić JAKICHKOLWIEK projektów ASP.NET
- 17. są bezpieczne w .NET
- 18. VisualVM Nie pokazano JAKICHKOLWIEK metod wymaganych dla wydajności wydajności Profili
- 19. strtol ponowne param
- 20. Zastępowanie kolejnych znaków tym samym pojedynczym znakiem
- 21. Czy są to wątki bezpieczne?
- 22. Czy wątki Keras są bezpieczne?
- 23. Czy wątki SQLite.Net są bezpieczne?
- 24. - Wiedzieć, kiedy wszystkie zadania są zakończone
- 25. Czy wątki NSIndexPath są bezpieczne?
- 26. (NIE) NULL dla kolumn NVARCHAR
- 27. Zamień ciąg znaków znakiem nowej linii PHPStorm
- 28. Jak bezpieczne są mapy Golang dla współbieżnych operacji odczytu/zapisu?
- 29. są powiązania zestawu ignorowane dla PublicKeyToken = null?
- 30. ffmpeg: które funkcje są wielowątkowe bezpieczne?
Na przykład pusty znak lub znak interpunkcyjny (lub litera, gdy baza nie zawiera tej litery) po przekonwertowaniu numeru zatrzyma skanowanie. –
@ JonathanLeffler: Z wyjątkiem wiodących spacji, kropek dziesiętnych, wszystkiego, co może być poprawnym wprowadzeniem, tak. –
czy nie spowodowałoby to błędu błędu seg-fault? –