Mit "Sscanf" String auf Int durchsuchen



  • unsure schrieb:

    Wie soll er dann den String zurückgeben???

    Indem er bei char to_bin4(unsigned int value, char* string){* direkt die '0' und '1' in string ablegt.

    strcpy schrieb:

    destination ... should not overlap in memory with source.

    Beispiel:

    char text[100] = "Hallo Weltmeister!";
    
    strcpy(text, text+6); 
    //oder
    strcpy(text+16, text);
    


  • Beispiel:

    C:
    char text[100] = "Hallo Weltmeister!";
     
    strcpy(text, text+6);
    //oder
    strcpy(text+16, text);
    

    Sorry, das check ich jetzt nicht. +6 +16 ??
    Gehts nur darum das Quelle und Ziel unterschiedlich groß sind?

    //in der Main:
    int buffer[max]   ;   // kümmert sich quasi um den speicher
    
    // Funktion:
    char* foo( char* puffer){
    
    // Meist Lokaler STring
    strcpy(puffer, lokaler_String);
    return puffer;
    

    ... ist aber Richtig oder?


  • Mod

    Schreib mal ein ganz naives strcpy selber. Eines, das wirklich stumpf ein Zeichen nach dem anderen kopiert. Dann rufst du das mal so auf, wie in DirkBs Gegenbeispiel. Fällt dir was auf? Was passiert und warum?



  • beginner_offl schrieb:

    Sorry, das check ich jetzt nicht. +6 +16 ??
    Gehts nur darum das Quelle und Ziel unterschiedlich groß sind?

    Ich zitiere dich mal aus http://www.c-plusplus.net/forum/p2378720#2378720 Zeile 23:

    beginner_offl schrieb:

    *(ch_ar+j)=dummy;         //oder hald ch_ar[j]
    

    Also scheinst du doch Pointerarithmetik zu kennen.



  • Ja,da hast du recht. War etwas schnell geschoßen. An Pointerarithmetik hab ich da jetzt gar nicht gedacht. War Käse.

    Das mit dem Überlappen hab ich jetzt kapiert. Dürfte dann undefiniertes Verhalten sein, wenn sich die Quelle Ziel überlappen.

    strcpy(text, text+6); geht z.B. bei mir immer : Soll copy bei "W" von Weltmeister beginnen

    strcpy(text+16, text); geht gar =>sollte Theoretisch !Hallo Weltmeister! ergeben?

    @ SeppJ
    Geht auch mit meinem Scopy nicht, habe die Funktion so gemacht :

    void scopy(char *ziel, char*quelle){
    
       while  ((*(ziel++) = *(quelle++) )  != '\0' ) ;   
    
    }
    

    => Das "echte" strcpy gibt doch nen Zeiger auf Char zurück... Das wäre dann ein Zeiger auf den Anfang der Zeichenkette...
    Habe jetzt mal so angedacht:

    char* scopy(char *ziel, char*quelle){
    
       char *begin;
    
       begin=&ziel[0];  
       while  ((*(ziel++) = *(quelle++) )  != '\0' ) ;   
    
       return begin;
    

    Compiler motzt nicht bei mir, gehen tut´s auch, aber ein komisches Gefühl über die Rückgabe bleibt 😕



  • beginner_offl schrieb:

    strcpy(text+16, text); geht gar =>sollte Theoretisch !Hallo Weltmeister! ergeben?

    Eigentlich sollte man "Hallo WeltmeisteHallo Weltmeister!" erwarten.
    Aber da du ja das Ende überschreibst, kann das auch unendlich laufen.

    Es gibt zum kopieren von Speicherbereichen zwei Funktionen: memcpy und memmove aus string.h.
    Bei memcpy dürfen sich die Bereiche nicht überlappen. Bei memmove schon.

    beginner_offl schrieb:

    Compiler motzt nicht bei mir, gehen tut´s auch, aber ein komisches Gefühl über die Rückgabe bleibt 😕

    Warum? Das einzige was merkwürdig aussieht, ist begin=&ziel[0];
    Kurz und knapp:

    begin=ziel;
    


  • Eigentlich sollte man "Hallo WeltmeisteHallo Weltmeister!" erwarten.
    Aber da du ja das Ende überschreibst, kann das auch unendlich laufen.

    Arrghh 😡 😡 Stimmt, ist ja copy , also fängt da an.



  • Jetzt mal ne Frage , die hier noch passt, die mir schon länger auf der Zunge brennt:

    Kann man eigentlich irgendwo den Source-Code zu den Zugehörigen .h Dateien ansehen? Also von der C-Bibliothek ?

    Weiterführend, ich benutze auf Arbeit DevC++.. da gibt´s nen Ordner wo die ganzen Standard Header drinn sind.... Aber wie funktioniert dann eigentlich das "Einbinden" der Funktionen genau?

    Wenn ich im Programm
    #include <string.h>

    und dann eben : strcpy(x, y) mache... Wo liegt dann die "Referenz" zu strcpy?
    Irgendwo muss doch der Code für strcpy herkommen / hinterlegt sein?

    Mag sein das mich diese "grundliegende" Frage jetzt etwas disqualifizert, aber so ganz leuchtet mir das nicht ein.


  • Mod

    beginner_off110 schrieb:

    Kann man eigentlich irgendwo den Source-Code zu den Zugehörigen .h Dateien ansehen?

    Klar, das sind ganz normale Headerdateien, die irgendwo auf deinem Computer sind. Wo genau, kommt auf dein System an. Erwarte nicht zu viel, da steht nur so etwas drin wie:

    char * strcpy ( char * destination, const char * source );
    char * strcat ( char * destination, const char * source );
    int strcmp ( const char * str1, const char * str2 );
    
    // usw.
    

    Sind eben Headerdateien und die enthalten keine Definitionen (außer du machst C++ und guckst die STL an). Ich nehme an, es geht dir um die Definitionen der Funktionen.

    Also von der C-Bibliothek ?

    Nur, wenn der Hersteller sie veröffentlicht. Was bei Open Source Implementierungen (z.B. GCC) in der Regel der Fall ist.

    Weiterführend, ich benutze auf Arbeit DevC++.. da gibt´s nen Ordner wo die ganzen Standard Header drinn sind.... Aber wie funktioniert dann eigentlich das "Einbinden" der Funktionen genau?

    So wie sonst auch. Wie Header funktionieren ist dir bekannt? Die Standardbibliothek ist keine Zauberei, das funktioniert genau so, wie wenn du das selber machst.

    Wenn ich im Programm
    #include <string.h>

    und dann eben : strcpy(x, y) mache... Wo liegt dann die "Referenz" zu strcpy?

    Dann noch nirgendwo. Wie schon gesagt, es ist genau so, wie bei deinen eigenen Programmen*. include fügt den Text des Headers ein, da drin stehen Deklarationen der Funktionen. Anhand dieser Deklarationen kann der Compiler die Korrektheit des Codes prüfen und dann allgemeinen Code erzeugen zum Aufruf einer solchen Funktion. Wo die Funktion tatsächlich ist, das interessiert den Compiler nicht.

    Irgendwo muss doch der Code für strcpy herkommen / hinterlegt sein?

    Der kommt dann ebenfalls aus einer ganz normalen Bibliotheksdatei, genau so als wenn du selber Bibliotheken schreibst. Der Linker sieht den vom Compiler erzeugten Aufruf, guckt in der Bibliothek nach der Funktion, setzt die passenden Werte ein und dann ist das Programm ausführbereit. Der einzige kleine Unterschied hier ist, dass die Standardbibliothek beim Linken normalerweise standardmäßig mit angegeben wird und du das nicht mehr selber machen musst und im Gegenteil den Linker speziell sagen musst, wenn du sie nicht möchtest. Manchmal musst du auch Teile der Standardbibliothek noch selber angeben (Bei den Mathefunktionen wird das gerne gemacht), dann ist das so, wie du es von eigenen Bibliotheken kennst.

    Mag sein das mich diese "grundliegende" Frage jetzt etwas disqualifizert, aber so ganz leuchtet mir das nicht ein.

    Ich habe das Gefühl, dass du den Normalfall nicht kennst. Wenn du nicht weißt, wie Bibliotheken funktionieren, dann nützt dir natürlich auch diese Erklärung wenig. Es macht dann wenig Sinn, das Verhalten einer speziellen Bibliothek zu diskutieren, wenn du nicht weißt, wovon überhaupt die Rede ist.

    *: Das ist übrigens nicht die ganze Wahrheit. Compiler können durchaus die Standardfunktionen erkennen und zwecks Optimierung die Aufrufe auch schon vor dem Linker einsetzen. Oder neuerdings kommt es in Mode, dass der Compiler gar keinen Code erzeugt, sondern dies auf den Linker übertragen wird, der dann mit voller Information den Code insgesamt besser optimieren kann. Aber ich denke, dieses Thema würde nun zu weit von der eigentlichen Frage wegführen.



  • Mir ist schon klar wie das einbinden von Header Files usw funktiniert.

    Anhand dieser Deklarationen kann der Compiler die Korrektheit des Codes prüfen und dann allgemeinen Code erzeugen zum Aufruf einer solchen Funktion. Wo die Funktion tatsächlich ist, das interessiert den Compiler nicht.

    => Aber mich würde das interessieren 🙂

    Der kommt dann ebenfalls aus einer ganz normalen Bibliotheksdatei, genau so als wenn du selber Bibliotheken schreibst

    =>Meine "Bibliotheken" beschränken sich bis jetzt darauf, das ich mir Code, den ich evtl. mal wieder brauche wegspeichere. OK, hab ich noch nie gemacht.

    Also die Funktion selbst ist dann quasi in irgendeiner Bibliotheksdatei gespeichert die ich eh nicht angucken kann, right?



  • Es heißt nicht umsonst Bibliothek. Die Funktionen sind schon compiliert in einer Datei zusammengefasst. Das kann eine statische oder dynamische Library sein.
    Daher bekommst du meist nicht den Code der Funktionen zu sehen.

    Der Name hängt vom System ab.
    Auf Unixsystemen meist libc
    Bei Microsoft: MSVCRT.DLL (Microsoft Visual C Run Time)
    Oder von GNU die glibc
    Da gibt es auch den Code von: https://sourceware.org/git/?p=glibc.git;a=tree

    Man kann auch selber Librarys bauen. Das ist kein Hexenwerk.



  • Jepp, hab das gerade ein bisschen gegooglet und paar interessante Sachen dazu gefunden, werd das mal probieren mir selbst eine zu "basteln".

    Aber noch mal zurück, ich google schon ne Zeit, aber finde nix( evtl. such ich auch falsch)... Wie die Standartfunktionen der C-Stan-Bibliothek programmiert sind... gibt´s da ne Seite wo man sich das angucken kann? Wär oft interessant.

    Im K&R steht meist zu veröffentlichten Beispielen "the C Standard Library Function to XY is similar"... ähnlich..

    Und wenn wir schon dabei sind: Kann mir evtl. noch jmd. Bibliotheken für C empfehlen, die man gängig brauchen kann, zB.: MP3 abspielen, JPG anzeigen, evtl . Verzeichnissarbeit... sowas in die Richtung? Also die Winapi aussen vor gelassen 🙂



  • beginner_offl schrieb:

    ... gibt´s da ne Seite wo man sich das angucken kann? Wär oft interessant

    Jepp, Wie oben geschrieben bei der glibc.

    Oder als Buch: The Standard C Library von P. J. Plauger



  • Merci, das werd ich mir mal genauer ansehen.



  • Und wenn wir schon dabei sind: Kann mir evtl. noch jmd. Bibliotheken für C empfehlen, die man gängig brauchen kann, zB.: MP3 abspielen, JPG anzeigen, evtl . Verzeichnissarbeit... sowas in die Richtung? Also die Winapi aussen vor gelassen 🙂

    Bzw.: Wie macht Ihr sowas, die Profis? Gar nicht mit C wahrscheinlich, aber wenn man´s doch braucht , z.B.: für nen kleinen Gimmick oder so... WinApi oder doch eher was anderes?



  • bin[LSB-j]=(i%2)+'0';
    

    Warum hier '0' ?? Kann mir das jemand erklären?

    Und hier :

    char binzahl[] = "10100101";
    char *pc = binzahl;
    
    unsigned int result = 0;
    
    while (*pc) {
      result *= 2;
      result += (*pc -'0');
      ++pc;
    }
    

    pc zeigt doch auf denn ersten Char, von Links her gelesen. Müsste doch dann Wertigkeit viel höher sein?? Die Schleife müsste doch rückwerts laufen?



  • binary_ask schrieb:

    bin[LSB-j]=(i%2)+'0';
    

    Warum hier '0' ?? Kann mir das jemand erklären?

    '0' ist 48 (ASCII-Code).
    '0'+5=53 und das ist der ASCII-Code von '5'.



  • char binzahl[] = "10100101";
    char *pc = binzahl;
    
    unsigned int result = 0;
    
    while (*pc) {
      result *= 2;
      result += (*pc -'0');
      ++pc;
    }
    

    ???? Ich verstehe das mit result *2 und das von links nach rechts lesen nicht. Normal lese ich eine Bin Zahl von rechts nach linkts? 1, 2, 4, 8, usw



  • binary_ask schrieb:

    ???? Ich verstehe das mit result *2 und das von links nach rechts lesen nicht. Normal lese ich eine Bin Zahl von rechts nach linkts? 1, 2, 4, 8, usw

    Verfolge das Verfahren mit Debugger oder Schreibtischtest.



  • Habe ich gerade gemacht. Ja funktioniert schon. Aber wie kommt man darauf? Hat das damit etwas zu tun, das schieben so etwas wie x2 nehmen ist?


Anmelden zum Antworten