string feld auslesen und auf integer prüfen klappt nicht



  • hi

    ich lerne grade c++ und bin noch ziehmlich am anfang jetzt hab ich anhand des buches ein programm geschrieben was aber nicht funktioniert.

    hier das programm:

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    int isinteger (char[]);
    
    void main (void)
    {
    	char a[10]="";
    	int zahl;
    
    	printf("Bitte geben Sie eine Zahl ein: ");
    	gets(a);
    
    	zahl=isinteger(a);
    
    	printf("\n%d",zahl);
    }
    
    int isinteger (char *a)
    {
    	int i=0;
    
    	while (a[i]!='\n')
    	{
    		if (isdigit(a[i]))
    		{
    			printf("%c\n",a[i]);
    			i++;
    		}
    		else
    		{
    			return(2);
    		}
    	}
    
    	return(atoi(a));
    }
    

    er bricht liefert aber immer 2 als return 😞 ich versteh nicht warum.

    kann mir jemand helfen und sagen was falsch ist?

    mfg david



  • Hi,

    was ist das für ein Buch?

    Ich sag Dir eins: "Schmeiß es weg oder, hör auf uns zu veräppeln!"

    Wenn das wirklich in dem Buch steht, ist es totaler Mist.

    #include <string.h>

    ist falsch!

    int isinteger (char[]); != int isinteger (char *a)

    falsch!

    void main (void)

    falsch!

    Ausserdem ist das C und nicht C++

    Gruss
    EarlyBird



  • edit: selbstzensur 😃 hab schrott geschrieben



  • hi

    das das c ist ist mir schon klar nur leider ist das ein c++ buch und die einführung also grundlagen etc. sind leider in C.

    @borg das ist ja der witz an digit das er in einem string guck ob das zeichen eine zahl ist. das funktioniert auch bis die zahl zu ende ist dann liest er irgendetwas anderes aus blos eben keine zahl so das der return wert dann 2 ist da er in die else anweisung springt.

    es könnte auch an der while schleifen bedingung liegen das er nicht '\n' das erkennt wenn die zahl zuende ist. was könnte ich als bedingung für die while schleife nehmen das er nach der letzten zahl abbricht.

    mfg david



  • wenn du es so machen willst musst du dein feld vor dem einlesen mit lauter '\n' füllen. sonst findet er halt keins und macht immer weiter :p
    imo ist das endezeichen bei strings aber 0 (nicht '0')

    also wie wärs mit:

    ...
    for( int i=0; i<=9; i++ )
      a[i]=0;
    ...
    if( a[i] != 0 )
    ...
    


  • Hi,

    ich wollte dich nicht perönlich angreifen, aber nochmal, was ist das für ein Buch?

    Meiner Meinung nach ist es verkehrt erst c zu lernen und dann c++.
    Die Schwächen ziehen sich wie ein roter faden durch deine Programme und das
    es zu Problemen kommt, siehst Du ja bereits jetzt schon.

    Nimm ein aktuelles C++ Buch und lerne daran, oder versuch mal das Tutorial von
    Volkard. Die Url dazu steht hier irgendwo im Forum (such mal danach).

    Ich könnte natürlich dein Programm posten, damit es funktioniert, aber
    das ist glaube ich nicht der Sinn der Sache, wenn ich dir gleich Streams
    und Bedingungen um die Ohren haue, die Du wahrscheinlich noch nicht
    verstehen wirst.

    Also, Kopf hoch und weiter...

    Nimm erst einmal das berühmte 'Hello World!' und alles wird gut.

    Gruss
    EarlyBird



  • hmm das buch ist eigentlich sehr aktuell (da hab ich extra drauf geachtet) das ist ausserdem schon das zweite buch was ich mir zu dem thema gekauft habe das erste war noch beschissener da wurde einen irgendwelcher code um die ohren gehauen und nicht erklärt was einzelne befehle und funktionionen bedeuten.

    da buch ist hier bedeutend besser und am ende jedes kapitels sind aufgaben die man zur übung lösen kann das finde ich ganz gut.

    ich würde ungern wieder von vorn anfangen nur wegen dem kleinen problem

    also scheinbar steht dort kein \0 am ende des strings da mus ja dann ein anderes zeichen stehen oder täusch ich mich da, wenn ja was könnte das für ein zeichen sein? so das ich das dann in die while schleifen bedingung einbauen kann.

    @borg mit der for schleife isses nicht so prickelnd er soll ja nur die tatsächlichen zeichen die eingegeben wurden prüfen ob sie zahlen sind wenn ich das mit der for schleife mache findet er ja keine zahl mehr wenn z.b. die eingegebene zahl nur 4 stellen hat. alles klar was ich meine?

    mfg david

    ps: ausserdem hab ich das buch bald durch 🙂 und will es jetzt durchziehen



  • es sind keine "kleinen" probleme, der inhalt ist schlicht und ergreifend falsch.

    lass mich raten, ein Markt und Technik buch?



  • nein ein Franzis buch 🙂



  • Okay, ich geb mich geschlagen...

    ich habe mal deinen code etwas verändert, sodass es immer noch c ist und kein
    c++.

    Aber Du möchtest ja gerne eine Lösung.

    int isinteger (char *a);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        char a[10]="";
        int zahl;
    
        printf("Bitte geben Sie eine Zahl ein: ");
        gets(a);
    
        zahl=isinteger(a);
    
        printf("\n%d",zahl); 	
    
        return 0;
    }
    
    int isinteger (char *a)
    {
        int r=0;
    
        while (*a)
        {
            if ( isdigit(*a) )
            {
                printf("%c\n",*a);
    			r = r * 10 + (*a - '0');
                ++a;
            }
        }
    
        return r;
    }
    

    Dir ist hoffentlich klar, das du einer BufferOverflow Attacke nicht gewappnet bist 😃

    Gruss
    EarlyBird



  • hmmm ok ich geb mich auch geschlagen 🙂 ich werd die 2 kapitel noch durharbeiten und kauf mir dann das dritte buch was hoffentlich diesmal was gescheites ist 🙂

    irgendwelche vorschläge?

    mfg david



  • Ist das Ergebnis wenigstens so wie du es wolltest ?

    Ich empfehle mal diese zwei Bücher, die man evtl. auch günstig gebraucht bekommt:

    http://www.amazon.de/exec/obidos/ASIN/3898421716/qid%3D1102282177/028-6820826-8315717

    und:

    http://www.amazon.de/exec/obidos/ASIN/3898642216/qid%3D1102282291/028-6820826-8315717



  • ok danke habe jetz mal das erste buch da bestellt mal sehen ob das was gescheites ist. danke für die mühe 🙂

    mfg david


Anmelden zum Antworten