2017-02-20 3 views
-2

Ich versuche, ein Array von Zeichenfolgen zu haben, wo in jedem Index dieses Arrays ein anderes Array von Zeichenfolgen vorhanden ist.Zeichenzeiger auf Zeigerarray in C

char Example[0] = { "array", "of", "strings"} 
Example[1] = { "array", "of", "strings2"} 
Example[...] = { ... } 

Ich habe gedacht, zu versuchen, char verwenden ** array [some_number] als eine Möglichkeit, dies zu tun, aber ich habe die Syntax zu unbequem gefunden.

#include <stdio.h> 

int main(){ 
    char *test[10] = {0}; 
    char *ex[3] = {0}; 

    ex[0] = "array"; 
    ex[1] = "of"; 
    ex[2] = "strings"; 

    test[3] = *ex; 

    printf("Content of test[3] = %s %s\n", test[3], ???); 

    return 0; 
} 

Ich habe Schwierigkeiten beim Versuch, diese auszudrucken ... gibt es eine andere Art, wie ich über das Erreichen gehen kann, was ich erwähnt habe? Jede Ressource/Hilfe wäre großartig.

+1

Es * fast * klingt wie Sie versuchen, eine Reihe von Array von Zeiger auf const string herzustellen.Ich benutze "fast" da, weil ich deinen Beitrag viermal gelesen habe und ich immer noch nicht erkennen konnte, was du sicher suchst. – WhozCraig

+1

'char * Beispiel [] [3] = {{" array "," of "," strings "}, {" array "," von "," strings2 "}, /*...*/};' ? – BLUEPIXY

+0

Nun, was ich wirklich versuche, ist eine Hash-Tabelle von virtuellen Speicheradressen zu erstellen. Mein erster Gedanke ist, dass ich mit einer Art von Hash spezifische Adressen in "Buckets" gruppiere. Ich dachte, wenn ich ein Array von Zeigern zu Arrays hätte, könnte ich das erreichen. Ich bin jedoch in der Syntax verloren gegangen. –

Antwort

2

Try this:

const char* example[] = { "array", "of", "strings" }; 

, die ein Array von 3 (implizit) Zeiger auf Arrays von char ist, die nicht verändert werden können. Lesen Sie die erste von example[0].

+0

Ich brauche einen dynamischeren Ansatz. –

5

Ich bin nicht wirklich sicher, was genau Sie wollen, aber wenn Sie ein Array mit Zeigern auf Arrays von Strings wollen, dann haben Sie zwei Alternativen.

Die erste ist zu erinnern, dass Arrays zu einem Zeiger auf sein erstes Element verfällt. Für eine Reihe von Zeichenfolgen wie

const char *array_of_strings[3] = { "abc", "def", "ghi" }; 

dann das Ergebnis des Zerfalls (die &array_of_strings[0] gleich) ist ein Zeiger auf einen Zeiger auf eine const char, d.h. const char**. Das bedeutet, dass eine Reihe von haben, dass Sie so etwas wie

const char **array_or_arrays_1[] = { array_of_strings }; 

Der andere Weg machen, ist ein Zeiger auf eine explizite Array von Strings zu haben, mit der Anschrift des Betreibers &. Wenn Sie auf &array_of_strings einen Zeiger auf ein Array von drei Zeigern zu char erhalten, ist der Typ const char *(*)[3]. Sie können es erklären leicht Typ-Aliasnamen:

typedef const char *(array_of_3_strings_t)[3]; 
array_of_3_strings *array_of_arrays_2[] = { &array_of_strings }; 
+0

Wie kann ich das dynamischer machen? –

+0

@JeffGreene Type-Aliase (mit 'typedef') und' malloc'? –

+0

@JeffGreene Was genau meinst du mit mehr "* dynamic *"? – RoadRunner

0

Ich versuche zu verstehen, was Sie über „dynamischeren Ansatz“ sagen. Vielleicht möchten Sie Array von Liste, die jede Liste (der Zeichenfolge) kann unterschiedliche Größe haben. Wenn das wurde Sie wollen, können diese Codes helfen:

#include<stdio.h> 
#include<string.h> 
typedef char * string; 
int main() 
{ 
    string array1[]={"apple","durian"}; 
    string array2[]={"mustard","carrot","spinach"}; 
    string array3[]={"garlic","onion","pepper", "blackpepper"}; 

    string 
     * array_of_array[]={ array1, 
          array2, 
          array3 }; 


    printf("\n%s %s", array_of_array[0][1],array_of_array[2][3]); 

    return 0; 
} 

Konsole Ergebnis:

Durian Black

Aber, wenn meinen Sie alle Ressourcen dynamisch initialisiert werden muss, damit dieser Code kann helfen ...

#include<stdio.h> 
#include<string.h> 

typedef char * string; 
typedef string * arrayString; 
typedef arrayString * arrayList; 

string newString(char * temp); 
arrayString newArrayString(int size); 
arrayList newArrayList(int size); 

int main() 
{ 
//Example 1, static allocation, string constant 
    string array1[]={"apple","durian"}; 
    string array2[]={"mustard","carrot","spinach"}; 
    string array3[]={"garlic","onion","pepper", "blackpepper"}; 

    arrayString Example_One[3]={ array1, array2, array3 }; 

//Example 2, dynamic allocation using pointer struct 
/************************************************************/ 
    arrayList Example_Two=newArrayList(3); 
     arrayString ExTwoValue1=newArrayString(2); 
     arrayString ExTwoValue2=newArrayString(3); 
     arrayString ExTwoValue3=newArrayString(4); 

     Example_Two[0]=ExTwoValue1; 
      ExTwoValue1[0]=newString("apple2"); 
      ExTwoValue1[1]=newString("durian2"); 
     Example_Two[1]=ExTwoValue2; 
      ExTwoValue2[0]=newString("mustard2"); 
      ExTwoValue2[1]=newString("carrot2"); 
      ExTwoValue2[2]=newString("spinach2"); 
     Example_Two[2]=ExTwoValue3; 
      ExTwoValue3[0]=newString("garlic2"); 
      ExTwoValue3[1]=newString("onion2"); 
      ExTwoValue3[2]=newString("pepper2"); 
      ExTwoValue3[3]=newString("blackpepper2"); 

/************************************************************/ 

//Print Result Here...  
    printf("\n%s %s", Example_One[0][0],Example_One[2][3]); 
    printf("\n\n%s %s", Example_Two[0][0],Example_Two[2][3]); 

    return 0; 
} 

string newString(char * temp) 
{ 
    string str = (string)malloc(sizeof(char)*(strlen(temp)+2)); 
    strcpy(str,temp); 
    return str; 
} 

arrayString newArrayString(int size) 
{ 
    arrayString arrStr= (arrayString)malloc(sizeof(string)*size); 
    return arrStr; 
} 

arrayList newArrayList(int size) 
{ 
    arrayList arrLst= (arrayList)malloc(sizeof(arrayString)*size); 
    return arrLst; 
} 

Konsole Ergebnis:

Apfel Black

apple2 blackpepper2

Verwandte Themen