Seite 1 von 1

Problem mit isdigit()

Verfasst: Do Nov 06, 2014 6:22 pm
von ProgBeginner
Hallo ;)

Ich habe auch mal wieder ein Problem ...

Grundsätzlich "lauffähig" ist mein Programm - aber isdigit() trifft Entscheidungen, die für mein Verständnis unlogisch sind.

Es soll gemäss Gauss'scher Summenformel die Summe aller natürlichen Zahlen bis zur ( per Kommandozeilenparameter übergebenen ) Zahl bestimmt werden.

Quellcode:

Code: Alles auswählen

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

int main( int argc, char* argv[] )
{
  if( argc != 2 ) // Wächter
  {
    printf( "Falsche Anzahl von Argumenten\n" );
    return 0;
  }
 
  int zahl = atoi( argv[1] );

  if (isdigit(zahl))
  {
    printf( "Ergebnis: %d\n", zahl * (zahl + 1) / 2);
  }

  else
  {
    printf( "FEHLER!\n" );
  }

  return 0;
}


Bildschirmausgaben vom Experimentieren mit diesem Progrämmchen :

Bild

Was läuft hier falsch?

Re: Problem mit isdigit()

Verfasst: Do Nov 06, 2014 6:50 pm
von Xin
ProgBeginner hat geschrieben:Grundsätzlich "lauffähig" ist mein Programm - aber isdigit() trifft Entscheidungen, die für mein Verständnis unlogisch sind.
Da gibt es jetzt natürlich zwei Möglichkeiten... -)
ProgBeginner hat geschrieben:

Code: Alles auswählen

int main( int argc, char* argv[] )
{
  ... 
  int zahl = atoi( argv[1] );

  if (isdigit(zahl))
Was läuft hier falsch?
Digit bedeutet Ziffer. '0' ist eine Ziffer, '1' ist eine Ziffer... '9' ist eine Ziffer.
Du wandelst eine Zahl(!) in ein int. Wenn die Zahl zufälligerweise '0'-'9' (48-57) entspricht, dann ist der ASCII-Code eine Ziffer. Wenn nicht... nicht.
Auch wenn isdigit() ein Integer erwartet, so erwartet es eben einen ASCII-Code und keine beliebige Zahl.

Re: Problem mit isdigit()

Verfasst: Do Nov 06, 2014 6:55 pm
von ProgBeginner
Das heisst ich kann den if(isdigit()) - Käse weglassen?

Re: Problem mit isdigit()

Verfasst: Do Nov 06, 2014 7:20 pm
von mfro
ProgBeginner hat geschrieben:Das heisst ich kann den if(isdigit()) - Käse weglassen?
Nun, wenn Du eine anständige Fehlerbehandlung haben willst (schließlich könnte ja auch jemand dein Programm mit "./gauss x" aufrufen), solltest Du schon prüfen, ob das erste Argument nur aus Ziffern besteht. Das sollte aber geschehen _bevor_ atoi() aufgerufen wird.

Der bessere Ansatz wäre allerdings, gleich strtol() (statt atoi()) zu verwenden. atoi() ist erstens deprecated, zweitens kann man mit strtol() direkt eine fehlerhafte Eingabe erkennen/abfangen.

Re: Problem mit isdigit()

Verfasst: Do Nov 06, 2014 7:26 pm
von ProgBeginner
Dieser Quellcode hier :

Code: Alles auswählen

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

int main( int argc, char* argv[] )
{
  if( argc != 2 ) // Wächter
  {
    printf( "Falsche Anzahl von Argumenten\n" );
    return 0;
  }
 
  int zahl = atoi( argv[1] );
  if (zahl > 0)
  {
    printf( "Ergebnis: %d\n", zahl * (zahl + 1) / 2);
  } else {
    printf( "FEHLER!\n");
  }

  return 0;
}


liefert bei negativen Zahlen "FEHLER!" ( wie beabsichtigt ) , aber auch bei Buchstaben. Für den Buchstabenfall versteh ich nur noch nicht so ganz, warum - aber scheint zu funktionieren.

Re: Problem mit isdigit()

Verfasst: Do Nov 06, 2014 10:25 pm
von oenone
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed and zero is returned.