Czy wszystkie ciągi znaków można uznać za tablicę znaków ( Tak ), czy wszystkie tablice znaków można uznać za ciągi znaków ( Nie ).
Dlaczego nie? i dlaczego to ma znaczenie?
Oprócz innych odpowiedzi wyjaśniających, że długość łańcucha nie jest nigdzie przechowywana jako część łańcucha, a także odniesienia do standardu, w którym łańcuch jest zdefiniowany, drugą stroną jest „Jak funkcje biblioteki C obsługują łańcuchy?”.
Chociaż tablica znaków może zawierać te same znaki, jest to po prostu tablica znaków, chyba że po ostatnim znaku następuje znak kończący wartość nul . Ten znak kończący wartość NUL pozwala na to, aby tablica znaków była traktowana (traktowana jako) ciąg znaków.
Wszystkie funkcje w C, które oczekują ciągu jako argumentu, oczekują, że sekwencja znaków zostanie zakończona na NUL . Dlaczego?
Ma to związek ze sposobem działania wszystkich funkcji łańcucha. Ponieważ długość nie jest uwzględniona jako część tablicy, funkcje łańcuchowe, przewijaj do przodu w tablicy, aż zostanie znaleziony znak nul (np. '\0'
- równoważny dziesiętnemu 0
). Patrz tabela i opis ASCII . Niezależnie od tego, czy używasz strcpy
, strchr
, strcspn
itp .. Wszystkie funkcje łańcuchowe polegać na nul kończącego znaku są obecne w celu określenia, gdzie koniec tego łańcucha.
Porównanie dwóch podobnych funkcji z string.h
podkreśli znaczenie znaku kończącego wartość nul . Weź na przykład:
char *strcpy(char *dest, const char *src);
strcpy
Funkcja po prostu kopiuje bajty od src
do dest
momentu nul kończącego znajduje charakter opowiadania strcpy
gdzie zatrzymać kopiowanie znaków. Teraz weź podobną funkcję memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
Funkcja wykonuje podobną operację, ale nie bierze pod uwagę ani nie wymaga, aby src
parametr był łańcuchem. Ponieważ memcpy
nie można po prostu skanować do przodu podczas src
kopiowania bajtów do, dest
aż zostanie osiągnięty znak kończący wartość NUL , wymaga jawnej liczby bajtów do skopiowania jako trzeciego parametru. Ten trzeci parametr zapewnia memcpy
tę samą wielkość informacji, którą strcpy
można uzyskać po prostu skanując do przodu, aż zostanie znaleziony znak kończący wartość nul .
(co podkreśla również to, co idzie nie tak w strcpy
(lub jakiejkolwiek funkcji oczekującej łańcucha), jeśli nie dostarczysz funkcji łańcucha zakończonego znakiem nul - nie ma pojęcia, gdzie się zatrzymać i z radością wybiegnie w pozostałą część twojego segmentu pamięci wywoływanie niezdefiniowanego zachowania, dopóki nul-postać nie znajdzie się gdzieś w pamięci - lub wystąpi błąd segmentacji)
Czyli dlaczego funkcje spodziewa się znakiem NUL łańcuch musi być podjęło znakiem NUL łańcuch i dlaczego jest to ważne .
char str[] = "hello";
sprawie.