2009-12-28 6 views
6

Einige Beispiel-Code, um die Frage zu starten:Looping eine feste Größe Array ohne ihre Größe in C zu definieren

#define FOO_COUNT 5 

static const char *foo[] = { 
     "123", 
     "456", 
     "789", 
     "987", 
     "654" 
}; 

Die Art und Weise dies normalerweise iteriert werden würde, wie bei einem Beispiel ist die folgende:

int i = FOO_COUNT; 
while (--i >= 0) { 
printf("%s\n", foo[i]); 

Gibt es überhaupt etwas zu tun, ohne explizit die Zahl 5 zu zählen? In der Zukunft könnte ich Elemente hinzufügen/entfernen und vergessen, die Größe des Arrays zu aktualisieren, so dass meine App bricht.

Antwort

16
int i = sizeof(foo)/sizeof(foo[0]); 
+0

würde dies immer noch funktionieren, wenn die Zeichenzeiger in foo auf Zeichenkette variabler Größe zeigen? – randombits

+0

ja (15 char Grenze) –

+0

so, wenn ein Element 15 Zeichen überschreitet, wird diese Überprüfung fehlschlagen? wahrscheinlich besser, den NULL Sentinel dann zu verwenden? Danke nochmal. – randombits

0

Ja.

sizeof (foo)/sizeof (char *)

ist 5.

2

Der üblicher Weg, dies zu tun, ist das Array mit NULL zu beenden und wiederholen, bis Sie das getroffen.

2

Ja.

int i = sizeof(foo)/sizeof(char*); 

Hinweis: Dies gilt nur für statisch zugewiesene Arrays. Es funktioniert nicht für malloc ed oder new Ed-Arrays.

12

eine Sentinel am Ende, wie NULL Verwendung:

static const char *foo[] = { 
     "123", 
     "456", 
     "789", 
     "987", 
     "654", 
     NULL 
}; 

for (char *it = foo[0]; it != NULL; it++) 
{ 
     ... 
} 
2
size_t i = sizeof foo/sizeof *foo; // or sizeof foo/sizeof foo[0] 

Dies teilt die Gesamtzahl der Bytes in der foo array (sizeof foo) durch die Anzahl von Bytes in einem einzigen Element (sizeof *foo), die die Anzahl der Elemente im Array angibt.

2

Es gibt auch eine andere Methode in C99, besonders wenn Sie benannte Indizes wollen, die zB Lokalisierung und ähnliches erlauben.

enum STRINGS { 
    STR_THING1, 
    STR_THING2, 
    STR_THING3, 
    STR_THING4, 
    STR_WHATEVER, 

    STR_MAX   /* Always put this one at the end, as the counting starts at 0 */ 
        /* this one will be defined as the number of elements */ 
}  

static const char *foo[STR_MAX] = { 
    [STR_THING1] = "123", 
    [STR_THING2] = "456", 
    [STR_THING3] = "789", 
    [STR_THING4] = "987", 
    [STR_WHATEVER] = "OR Something else", 
}; 

Mit dem Namen initializer mit dem Programm ist nach wie vor richtig, auch wenn ein ENUM-Wert ändert.

for (i = STR_THING1; i<STR_MAX; i++) 
    puts(foo[i]); 

oder irgendwo im Programm mit dem Namen Index

printf("thing2 is %s\n", foo[STR_THING3]); 

Diese Technik kann Ressourcenbündel zu simulieren. Erklären Sie eine enum und mehrere String-Arrays mit Sprachvarianten und verwenden Sie einen Zeiger im Rest des Programms. Einfach und schnell (vor allem auf 64-Bit-Maschinen, bei denen immer die Adresse eines konstanten (string) relativ teuer sein kann Edit:.. Die sizeof foo/sizeof * foo Technik funktioniert immer noch mit diesem

0

Für einige Anwendungen, versuchen und Fang funktionieren würde.

+0

Auch wenn C "versuchen" und "fangen" hatte, sehe ich nicht, wie relevant sie für die Iteration über ein Array sind. – Nefrubyr

Verwandte Themen