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, strcspnitp .. 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.hpodkreśli znaczenie znaku kończącego wartość nul . Weź na przykład:
char *strcpy(char *dest, const char *src);
strcpyFunkcja po prostu kopiuje bajty od srcdo destmomentu nul kończącego znajduje charakter opowiadania strcpygdzie 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 srcparametr był łańcuchem. Ponieważ memcpynie można po prostu skanować do przodu podczas srckopiowania bajtów do, destaż zostanie osiągnięty znak kończący wartość NUL , wymaga jawnej liczby bajtów do skopiowania jako trzeciego parametru. Ten trzeci parametr zapewnia memcpytę samą wielkość informacji, którą strcpymoż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.