2016-12-24 1 views
5

Ich brauche Strings dynamisch zu bekommen, aber da ich mehr als eine Zeichenfolge erhalten muss, muss ich Funktionen verwenden. Bisher habe ich diese (Ich habe // **** an Orten denke ich falsch sein könnte)Zeichenfolge mit C-Funktion erhalten

char* getstring(char *str); 

int main() { 

    char *str; 
    strcpy(str,getstring(str));//***** 
    printf("\nString: %s", str); 
    return 0; 
} 

char* getstring(char str[]){//***** 
    //this part is copy paste from my teacher lol 
    char c; 
    int i = 0, j = 1; 
    str = (char*) malloc (sizeof(char)); 
    printf("Input String:\n "); 
    while (c != '\n') {//as long as c is not "enter" copy to str 
     c = getc(stdin); 
     str = (char*)realloc(str, j * sizeof(char)); 
     str[i] = c; 
     i++; 
     j++; 
    } 
    str[i] = '\0';//null at the end 
    printf("\nString: %s", str); 
    return str;//****** 
} 

printf in der Funktion funktioniert, aber nicht zurück in main Funktion. Ich versuchte, void zurückzugeben, *s loszuwerden oder hinzuzufügen, einen anderen str2 machend und tring zu strcpy dort oder nicht unter Verwendung strcpy überhaupt. Nichts scheint zu funktionieren. Misse ich etwas? Oder vielleicht ist das überhaupt nicht möglich // Vielen Dank für Ihre Antworten

+0

Wir hatten in Jahr 1 hier zu kämpfen. Das einfache Zeug in C ist für mehr als 5% der Menschen nie einfach. –

+6

Bitten Sie Ihren Lehrer zu stoppen Casting malloc – coderredoc

+0

@coderredoc Das Casting ist optional? Ich würde es als Selbstdisziplin betrachten, wenn nichts anderes. –

Antwort

3

Den String-Teil erhalten Sie aus dieser answer. Fügen Sie nur \n als Eingabe für die getline-Funktion ein.

char * p = getline('\n'); 

Drei Dinge: - werfen nicht malloc, ob malloc/realloc erfolgreich ist und sizeof ist keine Funktion.

+0

' sizeof' ist vielleicht keine Funktion, aber entspricht der Syntax einer Funktion! Genau wie C# typeof() eingebautes Schlüsselwort –

+1

@PaulStelian .: yep – coderredoc

3

Das Problem ist nicht mit der Funktion, die Sie verwenden, sondern mit der Art, wie Sie versuchen, das Ergebnis in einen nicht initialisierten Zeiger zu kopieren.

Eine gute Nachricht ist, dass Sie müssen nicht kopieren - Ihre Funktion bereits eine Zeichenfolge in einem dynamischen Speicher reserviert, so können Sie den Zeiger direkt kopieren:

char *str = getstring(str); 

Dies sollte den Absturz beheben. Ein paar Punkte zu beachten, Ihre Funktion besser zu machen:

  • main Bedürfnisse free(str), wenn es geschieht, um Speicher
  • Store zu vermeiden realloc Ergebnis in einem temporären Zeiger, und machen Sie einen NULL Check durchsickern zu handhaben -von-Speicher Situationen richtig
1

Lassen Sie uns den Code ein wenig vereinfachen:

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

char* getstring() 
{ 
    char c = 0; 
    int i = 0, j = 2; 
    char *str = NULL; 

    if ((str = (char*) malloc(sizeof(char))) == NULL) 
     return NULL; 

    printf("Input String: "); 
    while (c = getc(stdin)) { 
     if (c == '\n') break; 

     str = (char*) realloc(str, j * sizeof(char)); 
     str[i++] = c; 
     j++; 
    } 
    str[i] = '\0'; 
    printf("getstring() String: %s\n", str); 
    return str; 
} 

int main() 
{ 
    char *str = getstring(); 
    printf("main() String: %s\n", str); 
    free(str); 
    return 0; 
} 

Dann führen:

$ make teststring && ./teststring 
cc  teststring.c -o teststring 
Input String: asdfasfasdf 
getstring() String: asdfasfasdf 
main() String: asdfasfasdf 
+1

Bitte erläutern Sie Ihren Code. Ich stimme ab. – Sibidharan

+1

Sie scheinen die früheren Kommentare zu 'j' nicht übernommen zu haben. –

+2

... und 'while (c! = '\ N')' ist undefiniertes Verhalten das erste Mal - nicht initialisiert. –

3

Es gibt zwei Dinge weg von der Lehre zu nehmen, wie es jetzt steht:

(1) Sie einen Weg, um den Verweis auf die neue Zeichenfolge der Rückkehr haben sollte, entweder als Argument übergeben durch Verweis auf die Funktion OR als Rückgabewert; Sie sollten nicht beide implementieren.

(2) Da das Unterprogramm, das Ihr Lehrer Ihnen gab, Speicher auf dem Heap zuweist, wird es für jeden Teil Ihres Programms verfügbar sein, und Sie müssen keinen Speicher selbst zuweisen. Sie sollten den Unterschied zwischen Heap-Speicher, globalem Speicher und automatischem (Stapel-) Speicher untersuchen, damit Sie die Unterschiede zwischen ihnen erkennen und mit jedem Typ arbeiten können.

(3) Da der Speicher bereits auf dem Heapspeicher zugewiesen ist, muss die Zeichenfolge nicht kopiert werden.

diese Fakten, Ihr Code Da kann wie folgt zu etwas vereinfacht werden:

int main() { 

    char *str = getstring(); 
    printf("\nString: %s", str); 
    return 0; 
} 

char* getstring(){ 
    .... etc 

In Zukunft möchten Sie darüber nachdenken, wie Sie Speicher in Ihren Programmen de-zuzuteilen. In diesem Code wird die Zeichenfolge beispielsweise nie freigegeben. Es ist eine gute Angewohnheit, über Ihre Strategie für die Aufhebung der Zuweisung von Speicher nachzudenken, den Sie zuweisen.

Verwandte Themen