Mit "Sscanf" String auf Int durchsuchen



  • evtl musst du den String zum Schluss umdrehen

    hmm... gibt´s da was fertiges oder muss ich das selbst basteln?



  • beginner_oofl schrieb:

    hmm... gibt´s da was fertiges oder muss ich das selbst basteln?

    Schau mal in der string.h

    Ich würde die Funktion strrev nennen.

    Wenn du nichts findest, musst du es selber machen. Ist aber nicht schwer, da du das Ende vom String schon hast.
    Da hast du ja eine '0' oder '1' abgelegt.



  • Werde morgen die "Shift" Variante probieren.

    Frage vorab, passt die "Maske" so?

    #include <stdio.h>
    #include <stdlib.h>
    #define _MEM sizeof(int)*8
    
    void shift(void){
    
    int mask;
    unsigned int value;
    
    mask= 0x1;
    mask<<=_MEM-1;
    

    Wenn ich das MSB "setzen" will , wäre das ja 0x80000000
    Also müsste das mit sizeof(int) ja passen?

    OFF Topic: eine potenzier funktion für INT hab ich auch nicht wirklich gefunden. Hab schon mal eine selber gemacht, aber etwas wie value= 2^5 geht nicht oder?



  • mask sollte auch unsigned sein.
    Deine Variante geht. Oder als Einzeiler mask = 1 << _MEM-1;

    beginner88888 schrieb:

    aber etwas wie value= 2^5 geht nicht oder?

    Doch, klar.
    Aber dafür braucht es keine Funktion. Du machst das da oben doch schon.
    Überleg mal, was ein links-Shift bedeutet. (Fang mit der 1 an und schiebe um eine Stelle)



  • 😡 Arr.... Wie war das mit dem Wald und den Bäumen...
    Klar, SHL 😡

    Aber etwas wie 5^7 krieg ich mit Shiften nicht hin...



  • Ich hab jetzt 2 Varianten mit der Rückgabe gemacht.
    Eine arbeitet direkt auf dem "Übergebenen" String, die andere nutzt nen "lokalen" String.

    Wie wäre das favorisierte Vorgehen? Bin ziemlich unschlüssig, irgendwie gefällt mir keine der beiden Farianten.

    V1:

    char* sh_bin(unsigned int value, char *str){
    
    unsigned int mask;
    char *show=NULL, *buffer=str;
    int erg=0 ;
    
    mask=0x1;      // =>   LSB is set 
    mask<<=_BITS-1;
    
    printf("Value in Dez :  %u\n", value);     
    str[_BITS]='\0';     
    
    while (mask !=0){
    
               if ((erg=value&mask)==0){                
                    *str='0';
                  } 
                    else{
                          *str='1';
                          if (show == NULL){
                              show=str;                           
                            }
                         }
             str++;     
             erg==0 ? putchar('0') : putchar('1');
             mask>>=1;
    
           }  
    *str='\0' ; 
    puts("\nValue in BIN 'cleared':");  
    puts(show);   
    str=buffer;  // set pointer back to starting adress
    strcpy(str, show);  
    
    return str;  
    
    }//END
    

    V2:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define _BITS sizeof(int)*8
    
    char* to_bin4(unsigned int value, char* string){
    
    unsigned int mask ;
    unsigned int convert; 
    char str[_BITS+1], *show=NULL;  
    int erg=0, i=0 ;
    
    str[_BITS]='\0';
    
    mask=0x1;      // =>   LSB is set 
    mask<<=_BITS-1;
    
    printf("Value in Dez :  %u\n", value);     
    
    while (mask !=0){
    
               if ((erg=value&mask)==0){                
                    str[i]='0';
                  } 
                    else{
                          str[i]='1';
                          if (show == NULL){
                              show=&str[i];                           
                            }
                         }
             i++;     
             erg==0 ? putchar('0') : putchar('1');
             mask>>=1;
    
           }  
    
    puts("\nNow in Binary:\n"); 
    puts(str);
    puts(show); // Starts with "Leading" '1';
    strcpy(string, show);
    return string ;
    
    }
    

    Es gab auch noch ne 3. Variante, ähnlich der ersten, die direkt auf dem Übergebenen String , aber mit index arbeitet.
    Hmm....



  • Noch was... Wie würdet Ihr die "Rückwandlung" von dem String (10010 z.b.) in Dezimal machen?

    Habs jetzt mal mit " strtoul(string, NULL, 2) " gelöst...
    Dachte daran es selbst zu machen mit einer Maske wo jede Stelle Ihrem Wert zugedacht ist... 😕



  • Sind die beiden Varianten soo schlecht?? 😞



  • Verzichte auf das strcpy und den lokalel String.

    strcpy schrieb:

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

    Zur Rückwandlung:
    Genau dafür wurde strtoul ja gemacht.

    Wenn du es trotzdem Probieren willst:

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

    Da fehlt aber noch der Test, ob es wirklich nur '0' oder '1' ist.
    Du bist aber nicht auf die 2 als Basis beschränkt. Bis 10 geht das auch.

    Und wenn du dich an http://www.c-plusplus.net/forum/p2376529#2376529 erinnerst, dann kannst du mit strchr und toupper sogar höhere Basen als 10 machen



  • Ok, Danke!

    Die Meldung gab mein DevC++ nicht aus.
    Ich weiß , das ist nicht die beste IDE, aber ich brauch was ziemlich kleines, was sich auch auf Arbeit auf unsere PC´s installieren lässt, ohne das die EDV mault..



  • Eventuell einfach alles, was nicht '0'-'9' ist auf space setzen, dann sollte es
    auf Anhieb funktionieren. Hab ich auch schon mal irgendwo gemacht.



  • Welche Meldung?
    Meinst du die von strcpy?
    Die gibt nicht der Compiler. Das steht in der Refernz / man-page zu strcpy.

    Schau mal auf der Startseite vom diesem Unterforum.
    Da gibt es eine Linkliste für Neulinge mit Links zu solchen Referenzen und auch zu den letzten Drafts von den verschidenen C Standards.



  • Ok, war ein Missverständinß. Dachte das gibt evtl. dein Compiler oder IDE aus.
    Benutze als REferenz meistens :
    http://www.cplusplus.com/reference/clibrary/



  • beginner_offl schrieb:

    Ok, war ein Missverständinß. Dachte das gibt evtl. dein Compiler oder IDE aus.
    Benutze als REferenz meistens :
    http://www.cplusplus.com/reference/clibrary/

    Dann schau da mal nach strcpy und lies es dir durch.
    Da stammt das Zitat nämlich her. 😃



  • Verzichte auf das strcpy und den lokalel String.

    strcpy schrieb:

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

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



  • Das hab ich mittlerweile koplett überarbeitet, aber eine Frage ist berechtigt:

    strcpy schrieb:

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

    Wie ist das genau gemeint? Meine String-Rückgaben laufen in etwa immer so :

    //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;
    

    Ich denke mit "should not overlap in memory with source." ust die Arbeit auf dem "Original-String" gemeint, der evtl. dann strcpy auf sich selbst gelegt wird?
    Weil so wie im obrigen Code mache ich´s meistens.

    Könnte ich evtl. auch direkt den lokalen STring irgendwie returnen?



  • 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.


Anmelden zum Antworten