Zahlen einlesen - finde Fehler nicht



  • Seltsame Dinge sagst du da:

    while( 1 == 1)        // 1 == 1 ist immer 1
    ...
    char temp[1];         // ein Array von einem Zeichen?
    ...
    if ( c < '0' || c > '9' )
        return 0;
    return 1;
    // warum das if nicht weglassen?
    // besser:
    return c < '0' || c > '9';
    ...
    strcat(num, temp);    // wo zeigt 'num' nur hin??
                          // ich würde mal drauf tippen, dass daher mein Segfault kommt...
    

    Auch solltest du beachten, dass du die in jedem Fall wieder zumachen musst, wenn du sie erfolgreich geöffnet hast.



  • // noch besser:
    return c >= '0' && c <= '9';
    

    🙄



  • Auch solltest du beachten, dass du die in jedem Fall wieder zumachen musst, wenn du sie erfolgreich geöffnet hast.

    Warum ich nur dazu neige, seit neuestem ganze Wörter zu verschlucken...
    Ich meine die Datei.

    _matze schrieb:

    Du musst erst Speicher reservieren!

    Der Einfachheit halber könntest du dem Fall aus num auch ein static char num[SIZE] machen.



  • also gut:

    Ich habe

    char* num
    

    durch

    char num[1024]
    

    ersetzt, nun spuckt das Programm immer 0 aus.

    Um sicherzugehn dass EOF nicht schuld an der ausgabe ist sieht die Textdatei nun so aus:

    2345[LEERZEICHEN][EOF]
    

    ich habe mal um zu testen ob das ding überhaupt durchläuft

    23f45 reingschrieben -> er erkennt dass es keine Zahl ist (return -1)

    und bitte:
    die Funktion isNum funktioniert ja so wie ich es will, diese ist dann ganz am schluss eventuell dran,
    ich schätze ja eure kreativität dazu aber primäres ziel ist es doch das teil zum laufen zu kriegen 🙂



  • while( 1 == 1)
    

    Das ist ja auch ein Quatsch! Ich mach das immer so:

    while(1!=(1!=1)) {...}
    

    😃



  • kleiner nachtrag:

    wegen dem datei schließen:

    das hier ist nur ein teilproblem einer anderen Aufgabe, dort werden alle Dateien wieder geschlossen

    ich habe es hier nur auf das nötigste reduziert, damit ich euch nicht 400 zeilen geben muss



  • Warum siehst du dir immer nur das Endergebnis an? Nutze den Debugger! Breakpoints setzen, schrittweise durchgehen, Variableninhalte überprüfen, Debug-Ausgaben notieren usw. Nur so kann man ein Programm sinnvoll debuggen.

    Falls du das Visual Studio nutzt, könnte dieser Artikel interessant für dich sein: http://magazin.c-plusplus.net/artikel/Debuggen mit VCPlusPlus6



  • verwende code::blocks und normalerweise kein c/c++
    hab wenig ahnung vom debugger dort,

    Bin aber auf etwas gestoßen:

    nt getNumber(FILE* fp)
    {
        char num[1024];
        char temp[1];
        temp[0] = fgetc(fp);
    
        if( isNum(temp[0]) == 0)
        {
            printf("Falsches Dateiformat oder beschädigte Datei\n");
            fclose(fp);
            return -1;
        }
        else
        {
            strcat(num, temp);
        }
    
        /** DEBUG **/
        printf("%s\n", num);
    
        while( 1 == 1)
        {
            temp[0] = fgetc(fp);
            if( isNum( temp[0] != 0))
            {
                strcat(num, temp);
    
                /** DEBUG **/
                printf("%s\n", num);
            }
    

    nochmal der selbe code von vorhin, nur dass ich mir stets den string ausgeben lasse:

    Ausgabe:

    ℓ_2ℓ_2
    

    weiß einer damit etwas anzufangen?

    werd gleich mal code::blocks debugger googlen



  • shisha schrieb:

    also gut:
    Ich habe

    char* num
    

    durch

    char num[1024]
    

    ersetzt, nun spuckt das Programm immer 0 aus.

    Damit sollte schonmal mein Segfault verschwinden.
    Weiters:
    Mach aus char temp[1] einfach ein char temp .
    Verzichte auf strcat , das ist für jeweils ein einziges Zeichen echt nicht nötig. (Ausserdem hat strcat gerne Nullbytes am Ende!)

    werd gleich mal code::blocks debugger googlen

    Nicht nötig. Einfach mal Debug -- Step into versuchen, da wird schnell alles klar.



  • Ach ja: das vorgeschlagene static für num war natürlich nicht nötig, mea culpa.



  • if( isNum( temp[0] != 0))
    

    Klammern verwirrt? Das gibt so wenig Sinn, weil's nie wahr wird. 😉



  • OK dank des debuggers hab ich nun die stelle wo es hängt:

    wie ichs irgendwie schon erwartet hab:

    while( 1 == 1)
        {
            temp[0] = fgetc(fp);
            if( isNum( temp[0] != 0))
            {
                strcat(num, temp);
    
                /** DEBUG **/
                printf("%s\n", num);
            }
    

    bei dem strcat aufruf hier bekomme ich einen segmentation fault, wieso ist mir unklar aber das wist ihr bestimmt 🙂

    die klammern hab ich ausgebessert



  • bei dem strcat aufruf hier bekomme ich einen segmentation fault, wieso ist mir unklar aber das wist ihr bestimmt 🙂

    man: strcat geht bis zum nächsten Nullbyte. Es kann aber keines mehr kommen, weil in temp nur ein Zeichen Platz hat. (siehe oben)
    Da ist es ohnehin schon nett von deinem Betriebsystem, dass das Ding nicht anfängt, über den Speicher zu tanzen...



  • die klammern hab ich ausgebessert

    Ein != 0 kannst du übrigens in einer Bedingung prinzipiell einfach weglassen (warum wohl?). In dem Fall wäre das auch klarer: if (isNum(x)) ...
    Analog kannst du statt if (x == 0) natürlich auch sagen if (!x) . Das wird dir in C oft begegnen.

    Nachtrag:
    Ich will mal nicht so sein; statt strcat würde ich in Zeile 26 sagen:

    num[strlen(nam)] = temp[0];
    

    Wobei es natürlich auch nicht nötig wäre, jedes mal strlen aufzurufen, weil man die momentane Länge auch einfach mitzählen könnte. Nur auch nicht vergessen, num am Ende mit einem Nullbyte zu terminieren, damit das Ende von printf & Co. erkannt werden kann. Da zeigt sich dann auch, dass temp nicht ein Array, sondern ein einzelnes Zeichen sein sollte.

    ^^Na gut, ich bin ohnehin schon pedantisch: man könnte auf temp sicher auch ganz verzichten, indem man gleich nach num schreibt.



  • Leute ich hab die Nase voll von dieser Funktion und umgehe das ganze:

    fscanf(fp, "%d", &int_x)

    sollte doch keine nachteile mit sich bringen?

    Um evt falsche Formatierung zu erkennen vergleiche ich dann das nächste eingelesene Zeichen einfach mit whitesspace und schon weiß ich was sache ist

    Seht ihr darin irgendwelchen neu auftauchenden schwierigkeiten?

    neuer code:

    if( fscanf(fp, "%d", &w) == 0)
        {
            printf("Konnte w nicht ermitteln\nDatei eventuell beschädigt");
            fclose(fp);
            return -1;
        }
        if(isspace(fgetc(fp)) == 0)
        {
            printf("Illegale Sequenz\n");
            printf("Datei eventuell beschädigt\n");
            fclose(fp);
            return -1;
        }
    


  • Seht ihr darin irgendwelchen neu auftauchenden schwierigkeiten?

    Nein. Aber ich hab Angst vor scanf() und mein Psychiater ist sich noch nicht sicher, ob die begründet ist.


Anmelden zum Antworten