wo ist der Hund begraben?



  • Hallo

    ich bin mir C am aneignen. Kenne mich noch nicht gut im Syntax aus, habe aber durchaus Erfahrung in anderen Sprachen.

    Nun wollt ich ein kleines Programm schreiben um die Grundfunktionen zu testen. Wird das kleine Programm gestartet, kann man eine Zeile über die Tastatur eingeben. In einer While Schleife werden mit getChar() die einzelnen Zeichen ausgelesen und gezählt. Zusätzlich werden Leerschlag und Tab als Trennzeichen für Wörter benutzt.

    Nun kann ich den String zwar eingeben, sobald ich Enter drücke erhalte ich jedoch die Fehlermeldung "RUN FAILED (exit value 1, total time: 7s)"

    Meine Frage, wo ist der Hund begraben? Ich arbeite mit Netbeans. Gibt es eine Möglichkeit zu debuggen?

    #include <stdio.h>
    #include <string.h>
    
    main() {
        char input[100];
        char currentChar;
        int countChars = 0;
        int countWords = 0;
    
        printf("type in a string \n");
        scanf("%s", &input);
    
        while(input != NULL){
            currentChar = getchar();
            if (strcmp(currentChar, " ") || strcmp(currentChar, "\t")){
                countWords ++;
            } else {
                countChars ++;
            }
    
            printf("zeichen %d ist %c \n", countChars, currentChar);
    
        }
    
        printf("es wurden %d zeichen und %d wörter eingegeben", countChars, countWords);
    
        return 0;
    }
    

    Vielen Dank für jegliche Anregungen!

    es grüsst
    01000100



  • 01000100 schrieb:

    ich bin mir C am aneignen.

    Lobenswert.

    Ich arbeite mit Netbeans.

    Hab ich noch nicht als C IDE probiert.
    Schon mal CodeBlocks od. VisualStudioExpress probiert?

    Gibt es eine Möglichkeit zu debuggen?

    Wahrscheinlich ja.

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char input[100];
        char currentChar;
        int i=0,countChars = 0;
        int countWords = 0;
    
        printf("type in a string \n");
        scanf("%s",input); while(getchar()!='\n'); /*Eingabepuffer leeren standardkonform*/
    
        while(input[i]!='\0'){ /* so testet man auf String/char-Array Ende !*/
            currentChar = input[i++]; /*input hast du oben schon gelesen,deshalb hier kein getchar mehr sondern lesen aus dem String input*/
            if ((currentChar==' ') || (currentChar=='\t')){/*strcmp für Stringvergleich, '==' für Zeichenvergleich !*/
                countWords ++;
            } else {
                countChars ++;
            }
    
            printf("zeichen %d ist %c \n", countChars, currentChar);
    
        }
    
        printf("es wurden %d zeichen und %d wörter eingegeben", countChars, countWords);
    
        return 0;
    }
    

    http://ideone.com/rZSBS



  • sieht mir ja FAST danach aus, als würde scanf - wie üblich und zu erwarten - die Eingabe beim whitespace für beendet ansehen und den Rest ignorieren.

    Wenn Du eh schon die schöne while getchar-Schleife drin hast, dann lass doch scanf raus und arbeite mit getchar und adde die einzelnen chars ins char array input ...



  • http://ideone.com/O7c9f

    printf("type in a string \n");
    while((currentChar = getchar()) != '\n') /*Eingabepuffer leeren standardkonform*/
    {
       input[i] = currentChar;
        i++;
    }
    input[i] = '\0';
    i = 0;
    


  • Hallo und besten Dank für die schnellen Antworten!

    Wenn möglich behalte ich Netbeans bei, sonst hab ich irgendwann 10 verschiedene Envi's am laufen.

    Soweit hab ich nun einige meiner bisherigen Unklarheiten beseitigt!
    Eine weitere Frage hab ich jedoch: Warum kann man nicht einfach

    while ((input[i++] = getchar()) != '\n');
    

    anstelle von

    while ((currentChar = getchar()) != '\n') {
            input[i] = currentChar;
            i++;
        }
    

    nutzen? 😕

    Lasst's euch gut geh'n!

    grüsse 01000100



  • Das ist meine laienhafte - dafür für mich verständlichste Notationsweise...
    Ich möchte bei Durchsicht einzelner Codeschnipsel nicht erst überlegen müssen, was wo wann in- oder dekrementiert wird, und ob der Zähler danach passt oder nicht passt.

    Für mich hat sich dieser Stil bisher bewährt und solange das so bleibt, wechsel ich auch nicht. Ich programmiere nur für eine OS-Schiene und nur für einen Systemtyp und bin auch kein "Komprimier"-Junkie, der Zeilen spart wo immer möglich.

    Ob Deine Schreibweise zum selben Ergebnis führt, wird man Dir hier sicherlich schnell beantworten oder Du überprüfst es dementsprechend selbst.



  • Achja: Netbeans sollte erwartungsgemäß den GNU gdb debugger entsprechend funktionell darstellen und Dir damit in der IDE das Debugging ermöglichen. Wo Du das evtl anhaken musst, sagt man Dir womöglich hier im IDE Forum oder auf einer Netbeans support page.



  • PrettyP schrieb:

    Ob Deine Schreibweise zum selben Ergebnis führt, wird man Dir hier sicherlich schnell beantworten oder Du überprüfst es dementsprechend selbst.

    ich habe das selbstverständlich zuerst getestet bevor ich nachfragte, und es lief nicht. nun hat sich aber herausgestellt, dass ich einen anderen Fehler hatte. Die while Schleife so wie ich sie wollte, funktioniert sehrwohl.

    besten dank für die Hilfe, Wutz und PrettyP!



  • while ((input[i++] = getchar()) != '\n');
    

    Das funktioniert so natürlich, anschließend sollte input aber noch ein anschließendes '\0' erhalten, auch ist eine input-Größenprüfung sinnvoll.

    while ((currentChar = getchar()) != '\n') {
            input[i] = currentChar;
            i++;
        }
    

    Wenn du die gesammelten chars anschließend nicht brauchst, brauchst du sie natürlich auch nicht in input auszusammeln.

    Für eine whitespacetolerante Eingabe würde sich z.B. anbieten:

    char input[100];
    scanf("%99[^\n]",input);while(getchar()!='\n');
    

    Hierbei bist du in jedem Fall auf der sicheren Seite.



  • All the flowers for Wutz 🙂 Danke für die schöne all-in-1-scanf-Lösung 🙂


Anmelden zum Antworten