2012-03-10 8 views

Odpowiedz

5

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.

1

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.

+0

Na przykład pusty znak lub znak interpunkcyjny (lub litera, gdy baza nie zawiera tej litery) po przekonwertowaniu numeru zatrzyma skanowanie. –

+0

@ JonathanLeffler: Z wyjątkiem wiodących spacji, kropek dziesiętnych, wszystkiego, co może być poprawnym wprowadzeniem, tak. –

+0

czy nie spowodowałoby to błędu błędu seg-fault? –

Powiązane problemy