2010-09-24 15 views

Odpowiedz

16

Nie ma. Dzieje się tak, ponieważ tablice ulegną zniszczeniu do wskaźnika do pierwszego elementu podczas przechodzenia do funkcji.

Musisz sam przekazać długość lub użyć czegoś w tablicy, aby wskazać rozmiar.


Najpierw opcja "podaj długość". Nazywają swoją funkcję z czymś takim:

int setIncludes (char *includes[], size_t count) { 
    // Length is count. 
} 
: 
char *arr[] = {"Hello,", "my", "name", "is", "Pax."}; 
setIncludes (arr, sizeof (arr)/sizeof (*arr)); 
setIncludes (arr, 2); // if you don't want to process them all. 

Sposób Sentinel wykorzystuje specjalną wartość na koniec wskazać nie więcej elementów (podobny do \0 na końcu C char tablicy wskazać ciąg) i byłoby coś takiego:

int setIncludes (char *includes[]) { 
    size_t count = 0; 
    while (includes[count] != NULL) count++; 
    // Length is count. 
} 
: 
char *arr[] = {"Hello,", "my", "name", "is", "Pax.", NULL}; 
setIncludes (arr); 

Inną metodą widziałem używane (głównie dla integralnych tablic) jest użycie jako pierwszy element długości (podobny do Rexx Zmienne macierzyste):

int setIncludes (int includes[]) { 
    // Length is includes[0]. 
    // Only process includes[1] thru includes[includes[0]-1]. 
} 
: 
int arr[] = {4,11,22,33,44}; 
setIncludes (arr); 
+0

Tak jak maksymalna wartość? –

+1

Zakładając, że masz na myśli pierwszy, @Mohit, rodzaj. Sztuczka 'sizeof' zawsze da ci długość tablicy (zakładając, że nie została już zepsuta do wskaźnika). Elastyczność polega na tym, że nie ograniczasz się do przekazywania tej wartości. Jeśli masz tablicę wielkości 1000, ale tylko 20 użytecznych wartości, możesz podać 20 jako rozmiar. – paxdiablo

+1

Dlaczego przechodzisz tablicę 'int' do funkcji, która oczekuje tablicy' char * '? – caf

0

Musisz znać rozmiar w dowolny sposób. Jednym ze sposobów byłoby przekazanie rozmiaru jako drugiego parametru. Innym sposobem jest uzgodnienie z osobą wywołującą, że powinien on zawierać wskaźnik zerowy jako ostatni element w podanej tablicy wskaźników.

2

Masz dwie opcje:

  1. można dołączyć drugi parametr, podobny do:

    int main(int argc, char**argv)

  2. ... czy można podwoić -null kończy listę:

    char* items[] = { "one", "two", "three", NULL }

+3

Co ciekawe, dla specjalnego przypadku 'main (int argc, char * argv [])', standard C wymaga, aby wywołujący przekazywał prawy licznik * i * zawierał NULL wskaźnik w 'argv [argc]'. Pasy i szelki, prawda, ale ma zalety. – RBerteig

1

Nie ma sposobu, aby po prostu określić rozmiar dowolnej tablicy jak to w C. Wymaga to wykonania informacja, że ​​nie jest świadczona w sposób standardowy.

Najlepszym sposobem na to jest przyjęcie długości tablicy w funkcji jako innego parametru.

-2

A co z funkcją strlen()?

char *text= "Hello Word"; 
    int n= strlen(text); 
OR 
    int n= (int)strlen(text); 
Powiązane problemy