Zahl beginnt mit 0



  • Folgendes Problem:
    Ich muss aus einer Zahl (a) die ersten und die letzten beiden Ziffern auslesen und diese dann in weitere Variablen (b,c) speichern.

    Bsp:
    a = 1234567
    ==>
    b = 12
    c = 67

    Meine Idee war also:

    int a = 1234567;
      int b;
      int c;
    
      //Get the first two and last two digits
      b = a / 100000;
      c = a % 100;
    

    Das funktioniert soweit auch sehr gut.
    Dabei habe ich aber leider ein Problem.

    Wenn a mit 0 anfängt, geht das ganze nicht (also z.B: a=0123456).

    Mir ist schon klar das eine führende 0 bei konstanten dazu führt, dass diese oktal dargestellt werden.
    Aber wenn ich den Wert über
    scanf(%d", &a)
    einlesen würde (WAS ICH ABER NICHT DARF), dann schafft er es doch trotzdem auch wenn eine Null am Anfang steht.

    Irgendjemand eine Lösung für mich. Vielleicht hat ja jemand schon eine andere Lösung wie man die ersten und letzten beiden Ziffern ausliest um dieses Problem zu umgehen.

    Danke im voraus
    Robs



  • #define Xstr(i) #i
    ...
    
    long l = atol( Xstr(012345) );
    

    Das Präprozessor Makrotoken # wandelt den Makroparameter in ein Stringliteral, d.h. aus 01234 wird "01234", und atol wertet führende Nullen nicht als Oktal.
    Was ein Präprozessor ist, erkläre ich hier aber nicht.



  • Danke für die schnelle Antwort. Aber als (fast) Anfänger würde ich mich auch über eine kleine Erklärung freuen, was du da genau machst.



  • Wenn du in einer Dezimalzahl führende Nullen als Ziffern betrachtest, hat eine solche Zahl keine erste Ziffer (001 = 01 = 1). Lies den Kram als String ein, etwa

    char buf[256];
    size_t len;
    int b = 0, c = 0;
    
    do {
      size_t i;
    
      fgets(buf, 256, stdin);
      /* fgets erhält das \n-Zeichen am Ende der Zeile, deshalb strlen(buf) - 1 */
      len = strlen(buf) - 1;
    
      for(i = 0; i < len; ++i) {
        if(!isdigit(buf[i])) continue;
      }
    } while(0);
    
    if(len > 1) {
      b = (buf[0]       - '0') * 10 + buf[1      ] - '0';
      c = (buf[len - 2] - '0') * 10 + buf[len - 1] - '0';
    } else if(len == 1) {
      b = c = buf[0] - '0';
    }
    


  • Auf Strings wäre ich auch schon gekommen.
    Problem ist, dass das Programm automatisch kontrolliert wird und wir noch keine Strings verwenden dürfen.
    Also falls jemanden auch eine Lösung ohne Strings einfallen würde.



  • robs89 schrieb:

    Auf Strings wäre ich auch schon gekommen.
    Problem ist, dass das Programm automatisch kontrolliert wird und wir noch keine Strings verwenden dürfen.
    Also falls jemanden auch eine Lösung ohne Strings einfallen würde.

    Aber Chars kennt ihr schon, oder?

    int c;
    char a = 0, b = 0;
    
        printf("Ziffern eingeben: "); 
        while ((c = getchar()) != EOF && c != '\n' && !a)
            if ((c >= '0') && (c <= '9'))
                a = c;
        if (c != '\n')
            while ((c = getchar()) != EOF && c != '\n')
                if ((c >= '0') && (c <= '9'))
                    b = c;
        if (a)
            printf("first digit: %c", a);
        if (b)
               printf("   last digit: %c", b);
        printf("\n");
    

    😃
    edit: upps, hab' mich von seldons Lösung anstecken lassen ... natürlich löst das Dein Problem NICHT. 😞



  • Naja, c zu bestimmen, ist ja trivial

    c = a % 100;
    

    Für b würde ich die Anzahl der Ziffern bestimmen

    int d = a, len = 0;
    do
    {
    	++len;
    }while(d/=10);
    

    Bei 1234567 haben wir eine Länge von 7. Jetz können wir das ausnutzen:

    b = a/(pow(10,len-2));
    

    Vorher aber bitte prüfen, ab die Länge wirklich größer als 2 ist.

    Edit: Problem nicht erkannt. Notiz an Hirn: Erst lesen, dann antworten 😃
    Bei einer 32 Bit Zahl bekommst du die führenden Nullen eben mit b=a/100000000;



  • robs89 schrieb:

    Folgendes Problem:
    Ich muss aus einer Zahl (a) die ersten und die letzten beiden Ziffern auslesen und diese dann in weitere Variablen (b,c) speichern.

    Bsp:
    a = 1234567
    ==>
    b = 12
    c = 67

    Meine Idee war also:

    int a = 1234567;
      int b;
      int c;
      
      //Get the first two and last two digits
      b = a / 100000;
      c = a % 100;
    

    Das funktioniert soweit auch sehr gut.
    Dabei habe ich aber leider ein Problem.

    Wenn a mit 0 anfängt, geht das ganze nicht (also z.B: a=0123456).

    Da kannst Du machen, was Du willst, ohne String kannst Du die führende Null doch nicht in

    int a;
    oder
    int b;

    speichern?!



  • robs89 schrieb:

    int a = 1234567;
      int b;
      int c;
      
      //Get the first two and last two digits
      b = a / 100000;
      c = a % 100;
    

    Das funktioniert soweit auch sehr gut.
    Dabei habe ich aber leider ein Problem.

    Wenn a mit 0 anfängt, geht das ganze nicht (also z.B: a=0123456).

    Wo ist das Problem?

    Wenn die Zahl mit Null anfängt dann steht in b halt nur 0 ... 9 .
    bei der Ausgabe kannst du dann mit "%0d" die Null wieder vorsetzen.

    Wenn du die Zahl als int hast ist die führende Null eh weg.

    Noch was: Hat die Zahl denn immer 7 Stellen?


Anmelden zum Antworten