Unbekanntes Problem mit string



  • *gg* das habe ich mir fast gedacht (ich hätte auch nach dem inhalt gefragt)

    PS.: die funktion liest nur grob zeichen von der tastatur ein, und legt sie auf einen charpointer. dh. ohne backspace&co

    long getstring(char *string[])
    {
    	*string=NULL;
    	char help;
    	long counter=0;
    	while((help=getche())!=13)
    	{
    		++counter;
    		*string = (char*) realloc((*string),sizeof(char)*counter);
    		(*string)[counter-1]=help;
    	}
    	++counter;
    	*string = (char*) realloc((*string),sizeof(char)*(counter));
    	(*string)[counter-1]='\0';
    	return(counter);
    }
    

    🤡 ich weiss... könnte man simpler schreiben...
    1. kommt der gleiche code öfter vor 🤡
    2. sizeof(char) = 1

    mfG (c)h



  • ka warum.. aber:
    im "main" steht das richtige im string.
    das puts gibt den inhalt des strings auch korrekt aus
    nur:
    seltsamerweise wird nach dem getstring der bildschrim gelöscht!!! ohne das ich die anweisung dazu gegeben hätte. durch das printf davor hatte man vorher nur den unterschied gesehen(er hätte noch einmal das selbe an die selbe stelle gschrieben)

    warum wird der bildschirm gelöscht?!?!?!?!
    😮 🙄 😞

    mfG (c)h



  • PS.: Microsoft Visual C++ 6.0 Enterprise Edition

    noch was:

    der bildschirm wird nach dem funktionsaufruf und vor der nächsten Anweisung...

    es liegt nicht am printf! (auch bei eigener ausgabefunktion wird der bildschirm gelöscht, also eher an der funktion)

    wer IRGENDETWAS weiss, bitte sagen. entweder habe ich ein totales blackout, oder ... der compiler spinnt, oder... ???

    mfG (c)h 😕 😕 😕



  • SideWinder schrieb:

    Zeig mal den Inhalt von getstring 🙂

    MfG SideWinder

    sooooooo... und was jetzt? 😕



  • *ts* wo bleiben die Moderatoren? :p
    ich führe in diesem Thread ein Selbstgespräch, und habe jetzt doch noch herausgefunden, wie genau der Fehler aussieht.
    Leider habe ich ka, wie ich ihn lösen soll..

    also.. wenn man mit "getche" etwas in der funktion eingibt, und dann im main wieder etwas ausgibt, fängt das printf im main in der 1. Zeile zu schreiben an, obwohl das getche() schon dorthin geschrieben hat.

    dh:
    nach dem funktionsaufruf springt der Cursor wieder in dei Ausgangsposition(0x0).
    1.) WARUM?
    2.) LÖSUNG?

    mfG (c)h



  • Weil getche() und printf() nicht auf die selbe Art und Weise ausgeben, deswegen schreibt printf() dann wieder in die erste Zeile.

    Meiner Einer hätte es folgendermaßen gelöst, wegen jedem Zeichen zu reallokieren ist ja kriminell.

    #include <iostream>
    #include <string>
    
    ...
    
    std::string asdf;
    std::getline(std::cin,asdf);
    std::cout << asdf << std::endl;
    

    Warum deine Version nicht funktioniert will ich ehrlich gesagt gar nicht so genau wissen *g*, aber das hier:

    (*string)[counter-1]='\0';
    

    kann nicht richtig sein.

    MfG SideWinder



  • SideWinder schrieb:

    Warum deine Version nicht funktioniert will ich ehrlich gesagt gar nicht so genau wissen *g*, aber das hier:

    (*string)[counter-1]='\0';
    

    kann nicht richtig sein.

    MfG SideWinder

    nananana... mal GENAUUUUU schaun...

    nehmen wir an.. wir haben im string zur zeit 5 chars "asdfg"
    wir haben im zaehler also: 5!
    zählen nach der schleife nochmal 1 hinzu -> 6
    schreiben an Position 6-1 ein '\0'.. also an position 5
    ein string beginnt bei 0... dh.. [5]='\0' ist korrekt!
    *gg* ich hoffe, dass du weisst, das man an strings ein '\0' anhängt :p

    Kriminell würde ich das nicht bezeichnen. Spart Speicherplatz; und man muss bei einer einfachen Eingabe nicht umbedingt auf die Geschwindigkeit achten.

    mfG (c)h

    PS.: warum machst du kein "using namespace std"?

    PPS.: ich habe eigendlich mein Programm in C geschrieben, und nicht C++ (meine Klasse: 2adt. Wir lernen C, und sollen auch C schreiben 🙄 ) und soweit ich weiss, kann unsereiner unter C das nicht machen, weil es kein "string" gibt (jedenfalls nicht mei unserem compiler)



  • string[counter-1] = 0; // Korrekt
    *string[counter-1] = 0; // Eh woot?
    

    MfG SideWinder



  • SideWinder schrieb:

    string[counter-1] = 0; // Korrekt
    *string[counter-1] = 0; // Eh woot?
    

    MfG SideWinder

    Eh woot? Eh woot? und sowos nennt sich MODERATOR 👎 ?! 😡

    long getstring(char *string[]) //funktionskopf
    

    (siehe oben)

    Eh woot? des is a dopplpointa!!! guten morgen!
    --> dein "korrekt" ist NICHT korrekt! du kannst doch nicht eine Zahl auf ein Array legen!!! 😮

    PS.: meine KORREKTE version war:

    (*string)[counter-1]='\0';
    

    MIT KLAMMERN!

    ich habs getestet! es funktioniert 100% 👍 (ausname: anschliessendes printf)

    mfG (c)h



  • Übersehen. Nein besser: Nicht erwartet. Mir ist unverständlich warum eine Lese-Funktion ein Array von Strings benötigt und nicht bloß einen 😕

    Eh woot? des is a dopplpointa!!! guten morgen!

    Guten Abend, hilf dir doch selber 👎

    MfG SideWinder



  • *gg* ich helft mir ja schon selbst... keine angst.

    *gg* sag dir aber trotzdem, warum man einen doppelpointer braucht:
    weil in der Funktion erst Speicherplatz reserviert wird, ist die position im arbeitsspeicher nicht fix.
    Beim Reservieren kann Speicher auf einer Anderen Position angelegt werden, als beim Aufruf im Speicher ist, damit auch diese Position im Unterprogramm bearbeitet werden kann, muss die Adresse des Pointers übergeben werden.
    Kann auch vorkommen, wenn das realloc speicher an einer anderen Stelle allociert.

    PS.: string ist ein Pointer auf ein Array.

    KURZ: UM DEN POINTER AUF CHAR IN DER FUNKTION, WELCHE GETSTRING AUFRUFT VERÄNDERN ZU KÖNNEN!
    mfG (c)h



  • Edit: Peinlich 🙄

    MfG SideWinder



  • int main(int argc,char *argv[])
    {
       char *str1=NULL; 
       getstring(str1); //nach dem reservieren zeigt der pointer noch immer auf NULL
       getstring(&str1); //die funktion bekommt die adresse des pointers übergeben, damit die adresse veränderbar ist
    // du weisst doch, dass die variablen, die übergeben werden nur eine kopie des original sind.
    // und daher nach der funktion ansonsten noch immer auf NULL zeigen
    }
    

    realloc gibt "void *" zurück, was man mit dem castoperator zu einem "char *" macht, welchen man jetzt auf einen pointer schreibt
    auf diesem pointer befindet sich die ADRESSE.

    in deinem fall wird auch auf "array" die adresse des reservierten speichers stehen.

    vielleicht versteht dein compiler ja von selbst, dass du die adresse auch auserhalb brauchst, und er keine kopie anlegen soll... (meiner verstehts nicht)

    mfG (c)h



  • @sidewinder
    so wie du es machst kann und darf es nicht funzen... *verwirrt*

    ja nochwas damit du den pointer verändern kannst brauchst du logischer weise noch einen pointer auf den du dann mit dem anderen pointer übergreifen kannst (hat chille bereits alles richitig erklärt)

    @chille du trumpst wieder mal auf *ROFL*

    very nice greetz of balthazar



  • @balthazar: super aufgepasst! 👍
    @SideWinder: welche schule gehst du noch mal? :p
    sorry, aber deine funktion alloc darf wirklich nicht funktionieren(jedenfalls nicht unter MVC++6.0)

    PS.: HOCH LEBE LANGER & LENZHOFER!

    msg (c)h



  • Okay du hast recht, ich war verwirrt weil ich ja bei strcpy(), etc. auch kein char** übergeben muss. Aber du willst ja nicht den Inhalt verändern sondern den Zeiger an sich.

    Dann hast du recht.

    MfG SideWinder



  • BTW: Funktionierts inzwischen oder nicht?

    MfG SideWinder



  • funktioniert mittlerweile 😉
    thread closed. 😃

    mfG (c)h


Anmelden zum Antworten