2017-09-19 3 views
-2

Ich habe ein Zeichenfeld von Zeichenfolgen, wobei jede Zeichenfolge durch Null abgeschlossen wird.Zeiger auf Zeiger, dynamische Speicherzuweisung

Ein Zeiger auf das Array ist die Startadresse der ersten Zeichenfolge.

const char* p = "I\0had\0a\0little\0lamb\0"; 

Wie kann ich die Startadresse der anderen 4 Zeichenfolgen speichern?

Dies ist die Logik, die ich angelegt habe, aber es funktioniert nicht richtig:

const char** stara(const char* p, int n) { 
    const char** add=new char*[n]; 
    int k=0; 
    add[k]=p; 
    for(i=1;i<p.size()) { 
     if(p[i]=='\0') 
      add[++k]=&p[i+1]; 
    } 
+1

ein Vektor von Zeigern - und ich sehe nicht, was Ihre Frage (soweit ich es aus machen kann) hat mit dynamischer Speicherzuweisung zu tun. –

+0

ich weiß, dass ich Zeiger erstellen muss, können Sie mir helfen, mehr, ich bin ein Anfänger –

Antwort

0
const char* p = "I\0had\0a\0little\0lamb\0"; 

const char* arr[5]; 
arr[0] = p;       // "I" 
arr[1] = arr[0] + strlen(arr[0]) + 1; // "had" 
arr[2] = arr[1] + strlen(arr[1]) + 1; // "a" 
arr[3] = arr[2] + strlen(arr[2]) + 1; // "little" 
arr[4] = arr[3] + strlen(arr[3]) + 1; // "lamb" 

, die für kleine Saiten in Ordnung. Aber wenn Sie versuchen, diese zur Laufzeit dynamisch zu tun, vor allem, wenn Sie nicht wissen, wie viele Teil Sie gehen mit zu tun haben, dann verwenden Sie etwas mehr wie folgt statt:

#include <vector> 

const char* p = "I\0had\0a\0little\0lamb\0"; 

std::vector<char*> vec; 
while (*p) 
{ 
    vec.push_back(const_cast<char*>(p)); 
    p += (strlen(p) + 1); 
} 

// vec[0] = "I" 
// vec[1] = "had" 
// vec[2] = "a" 
// vec[3] = "little" 
// vec[4] = "lamb" 

aber sagen, dass basierend auf Ihre in den Kommentaren angegebene Anforderung:

Gegeben ein Zeiger p auf das erste Element in einem Zeichenarray, das n Zeichenfolgen enthält (jeweils mit '\ 0' abgeschlossen), ein dynamisch zugeordnetes Array der Startadressen aller n zurückgeben Zeichenketten

Sie brauchen etwas mehr wie folgt aus:

const char** stara(const char* str) 
{ 
    const char* p = str; 
    int n = 0; 
    while (*p) 
    { 
     ++n; 
     p += (strlen(p) + 1); 
    } 

    const char* *arr = new const char*[n+1]; 

    p = str; 
    n = 0; 
    while (*p) 
    { 
     arr[n++] = p; 
     p += (strlen(p) + 1); 
    } 

    arr[n] = NULL; 

    return arr; 
} 

const char* *arr = stara("I\0had\0a\0little\0lamb\0"); 

// arr[0] = "I" 
// arr[1] = "had" 
// arr[2] = "a" 
// arr[3] = "little" 
// arr[4] = "lamb" 
// arr[5] = NULL 

delete[] arr; 

Live demo

+0

danke, was, wenn p ist variabel .. können Sie mir verallgemeinerte Art und Weise dies zu tun, mit dynamischen Speicherzuweisung –

+0

können Sie sagen Ich benutze den neuen Operator in C++ –

+1

Es gibt keinen guten Grund, 'new []' direkt zu verwenden (außer zu Lernzwecken). 'std :: vector' ist bereits ein dynamisch großes Array. Der Code wäre viel komplexer, um 'new []' direkt zu verwenden. Und die Verwendung von 'new' liegt außerhalb des Bereichs Ihrer Frage. Wenn Sie es brauchen, bearbeiten Sie Ihre Frage mit mehr Details über Ihre tatsächlichen Anforderungen. Oder posten Sie eine neue Frage. –

2

Sie müssen sich, dass für Code schreiben. Woher weißt du die Anzahl der Strings?

Angenommen, Sie n wissen 4 zu sein und Sie möchten 4 Zeiger, dann könnten Sie tun:

const char *p0 = p; 
const char *p1 = p0 + strlen(p0) + 1; 
const char *p2 = p1 + strlen(p1) + 1; 
const char *p3 = p2 + strlen(p2) + 1;