Problem mit isdigit()

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Problem mit isdigit()

Beitrag von ProgBeginner » Do Nov 06, 2014 6:22 pm

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?
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit isdigit()

Beitrag von Xin » Do Nov 06, 2014 6:50 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Problem mit isdigit()

Beitrag von ProgBeginner » Do Nov 06, 2014 6:55 pm

Das heisst ich kann den if(isdigit()) - Käse weglassen?
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Problem mit isdigit()

Beitrag von mfro » Do Nov 06, 2014 7:20 pm

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.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Problem mit isdigit()

Beitrag von ProgBeginner » Do Nov 06, 2014 7:26 pm

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.
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Problem mit isdigit()

Beitrag von oenone » Do Nov 06, 2014 10:25 pm

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.

Antworten