2016-05-06 2 views
2

Ich weiß, ichWie kann ich eine Zeichenfolge von einem Benutzer abrufen und dann dynamisch zuweisen?

tun kann
char string[100]; 
gets(string); 

Aber wie kann ich den Speicher dynamisch in Richtung dieser Zeichenfolge zuweisen, die nicht unbedingt von 100 Länge sein könnte?

+2

Der Zweck von SO ist, Probleme zu lösen, die Sie mit vorhandenem Code (oder Algorithmen) haben. Der Zweck des Internets ist es, Ihnen einen Ort zu geben, an dem Sie nach einem solchen Code suchen können. – KevinDTimm

+0

Ding 1: Verwenden Sie nicht 'gets'. Es hat keine Möglichkeit, mit Strings zu arbeiten, deren Länge Sie nicht im Voraus kennen, es hat keine Möglichkeit, den Überlauf des Puffers, den Sie ihm geben, zu verhindern. Ding 2: Sie können 'malloc' verwenden, um einen Puffer zu erstellen, von dem Sie hoffen, dass er groß genug ist. Rufen Sie dann' fgets' auf und rufen Sie 'realloc' auf, um den Puffer auf die Größe der tatsächlich erhaltenen Zeichenfolge zu verkleinern. Oder Sie können die Zeile selbst nach und nach mit "realloc" lesen, um einen Puffer immer größer zu machen, je nach Bedarf. Eine Möglichkeit, dies zu tun, zeigt sich in der Antwort von hackcks. –

Antwort

0

Sie können realloc verwenden, um die Zeichenfolge unbekannter Länge abzurufen. Lesen Sie die eingegebene Zeichenfolge Zeichen für Zeichen, bis '\n' oder EOF gefunden wird, und verwenden Sie jedesmal realloc, um Speicher für das nächste zu lesende Zeichen zuzuweisen.

char *read_string(void) 
{ 
    int c; 
    int i = 0; 
    char *s = malloc(1); 
    printf("Enter a string: \t"); // It can be of any length 
    /* Read characters until found an EOF or newline character. */ 
    while((c = getchar()) != '\n' && c != EOF) 
    { 
     s[i++] = c; 
     s = realloc(s, i+1); // Add memory space for another character to be read. 
    } 
    s[i] = '\0'; // Nul terminate the string 
    return s; 
} 
+0

könnte mit "Blöcken" von N Bytes implementiert werden, um 'realloc' Aufrufe zu vermeiden –

+0

@PierreEmmanuelLallemant; Wie? – haccks

+0

Zum Beispiel 'int block_size = 16;' und call realloc nur wenn 'i% block_size == 0'. –

Verwandte Themen