# String auf Zahlen in C (nicht in C++) Sprache überprüfen



## bigjuju4fr (16. Juli 2011)

Guten Abend,

ich bin ganz neu mit der C Sprache und versuche grade eine Aufgabe mit string zu lösen aber ich komme nicht klar.
hier ist die aufgabestellung:

es soll eine Funktion entwickelt werden, die einen String untersucht, ob dieser eine korrekte negative Integer-Zahl darstellt oder nicht .( keine Exponentialeingabe)
Im String sind keine Leerzeichen.
Der String ist beliebiger lang
und return 0; --> String stellt eine negative Zahl dar.
return 1; --> string stellt keine negative zahl dar.


ich weiss, dass es im Programm überprüft werden sollte, dass im String immer ein in der ersten Stelle ein minus (-) zeichen drin ist, dann ob eine zahl immer im String enthalten ist.
und es sollte keine leerzeichen im String drin stehen.

Aber ich weiss nicht wie ich das ganze auf der Reihe jetzt kriege und brauche eure Hilfe.
Danke.


----------



## bigjuju4fr (16. Juli 2011)

Also ich habe mir was überlegt und bin auf diese Lösung gekommen..

```
#include <stdio.h>
#include <cctype.h>

void main ()
{

int check_input(char *s)

/* Funktion prüft, ob eingegebener String ngative Zahl ist */
{

  unsigned i;

  if (s[0] != '-')  /* Minus-Zeichen (-) überprüfen */
  {
    return 1;
  }

for(i=1; i<strlen(s); i++)  /* Überprüfe Ziffern bzw Zahl */
{
if(s[i] > '0' || s[i] < '9')
return 1;
}
return 0;
}
}
```


ich werde's noch testen, ob alles stimmt. Aber könntet ihr gerne andere Lösungen vorschlagen.
Danke


----------



## sheel (16. Juli 2011)

Hi und nachträglich Willkommen bei tutorials.de 

Ein Tipp zu den Forumsfunktionen:
Schreib C/C++-Code das nächste Mal biite zwischen
[code=cpp]...[/code].
Machts um einiges besser lesbarer.

Zu der Funktion:
Prinzipiell ganz in Ordnung, aber ein Denkfehler (oder nur Tippfehler?):
Beim if mit der '0' und '9' gehören < und > vertauscht
Es ist dann keine Ziffer,wenn es kleiner als 0 oder größer als 9 ist (mit den ASCII-Werten betrachtet).

Noch zwei Punkte:
Warum steht check_input _im_ main? Das sollte da raus.
Und die includes stdio und cctype brauchst du für diesen Code beide nicht. Verlangsamt nur das Kompilieren.

Gruß


----------



## bigjuju4fr (16. Juli 2011)

hallo und danke für deinen Vorschlag.
ich habe den Tippfehler beim if schleife bemerkt, nachdem ich gepostet habe.
Allerding ich teste grade aber bekomme immer einen Fehler, dass die Variable s ein nicht deklarierter Bezeichner ist.  :-(

und für den letzten punkt haste Recht, braucht man keine stdio.h und cctype.h sondern string.h
kannst du mir helfen, den Fehler zu beheben?
Danke.

Gruß


----------



## sheel (16. Juli 2011)

In welcher Zeile wird der Fehler angezeigt?
Hast du die Funktion auch aus dem main rausgenommen?

if ist übrigens keine Schleife. Schleifen wiederholen sich (while, for, do-while).


----------



## bigjuju4fr (16. Juli 2011)

ja hab die Funktion aus dem main rausgenommen und der Fehler beginnt nach der if Anweisung (s[0] ...


----------



## sheel (16. Juli 2011)

Also, wenn du das gemacht hast, sollte es eigentlich keine Probleme geben.
Kannst du nocheinmal den Code zeigen, wie er jetzt aussieht?


----------



## bigjuju4fr (16. Juli 2011)

Ok.
So sieht der Code:


```
#include <string.h>

int check_zahl(char* s);

void main()

/* Funktion prüft, ob eingegebener String ngative Zahl ist */
{

  unsigned i;

  if (s[0] != '-')  /* Minus-Zeichen (-) überprüfen */
  {
    return 1;
  }

for(i=1; i<strlen(s); i++)  /* Überprüfe Ziffern bzw Zahl */
{
if(s[i] > '0' || s[i] < '9')
return 1;
}
return 0;
}
```


----------



## sheel (16. Juli 2011)

Scheinbar hast du das Prinzip von Funktionen nicht ganz verstanden.
Die gibts, um Codeteile aus dem main auszulagern, und dann aus dem main
nur über den Funktionsnamen den ganzen Code auszuführen.

Macht bei sinnvoller Verwendung
1) alles übersichtlicher,
2) spart einem das Immer-wieder-neuschreiben bei mehrmaliger Verwendung
usw...

Hier was zum Lesen:
http://openbook.galileocomputing.de/c_von_a_bis_z/

Zum Code:
So funktionerts:

```
#include <string.h>
 
int check_zahl(char* s)
{
    unsigned i;
    if (s[0] != '-')
        return 1;
 
    for(i=1; i<strlen(s); i++)
    {
        if(s[i] > '0' || s[i] < '9')
            return 1;
    }
}

int main()
{
    return 0;
}
```

Wenn "in" einem if nur eine einzige Anweisung steht, kann man die {} auch weglassen.
Siehst du bei der Minus-Überprüfung.

Und main muss laut Standard int als Returntyp haben. Nicht void.
Vor allem, wenn man beim return Zahlen zurückgibt (int).
void würde für "nichts" stehen.

Gruß


----------



## saftmeister (17. Juli 2011)

Ich hätte atoi() verwendet


----------



## deepthroat (19. Juli 2011)

Hi.





saftmeister hat gesagt.:


> Ich hätte atoi() verwendet


Hm. Allerdings ignoriert atoi Leerzeichen am Anfang und beliebige Zeichen nach x-beliebigen Ziffern...

Gruß


----------

