C Programmieren in VS: char counter zeigt Buchstaben

Der Jockel

Ensign
Registriert
Nov. 2016
Beiträge
150
Ich habe mich als blutiger C Anfänger an das oft empfohlene Buch "The C Programming Language" gesetzt als IDE verwende ich das neueste Visual Studio Community. Nun bin ich bei dem Kapitel "character input and output" angekommen bis hier hat alles funtioniert. Doch folgendes Programm bekomme ich nicht zum Laufen:
C:
#include <stdio.h>

/*count characters in input v2*/
main()
{
    double nc;
    
    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%.0f\n", nc);
}

Als Ausgabe in der Konsole kommen nur die eingegebenen Buchstaben wie im "copy input to output program" anstatt des counters. Ist das ein Problem von VS?
 
Im Prinzip ist das Programm lauffaehig und macht das, was Du willst. Allerdings ist der EOF character eigentlich dazu da, das Ende einer Datei zu melden. Aber gut.

Wenn Du das startest, siehst Du die Eingaben, weil das eben das Standardverhalten ist. getchar() liest von stdin, also per default die Konsole, und Deine Eingabe wird da auch ausgegeben, nicht aber von Deinem printf(), sondern vom Betriebssystem, welches die Konsole bereitstellt.

Per Tastatureingabe kannst du EOF mittels CTRL+D auf einer leeren 'Zeile' erzeugen. Gib' also was ein, dann ENTER, dann CTRL+D und dann siehst Du die erwartete printf() Ausgabe.

Waere einfacher, die Bedingung im for() loop zu erweitern:
Code:
main()
{
    double nc;
    char ch;
    
    for (nc = 0; ((ch = getchar()) != EOF) && (ch != '\n'); ++nc)
        ;
    printf("%.0f\n", nc);
}
Hier wird zuerst "ch = getchar()" ausgefuerht, dann "ch != '\n' ", also es funktioniert.
Die variable 'nc' als double ist etwas seltsam, normalerweise wuerde man fuer sowas einen Integer-typ verwenden, also 'int' oder 'long int', aber verwerflich ist es nicht unbedingt.
 
  • Gefällt mir
Reaktionen: HigH_HawK
hans_meiser hat den Nagel auf den Kopf getroffen.

Ich würde auch eher
Code:
long nc;
anstelle von
Code:
double nc;
verwenden

Zusätzlich würde ich hier auch noch auf explizite Deklaration der main() Funktion achten, da dies die korrekte Notation im Standard ist:

C:
int main(void)
{
    long nc;
    char ch;
   
    for (nc = 0; ((ch = getchar()) != EOF) && (ch != '\n'); ++nc);

    printf("%d\n", nc);

    return 0;
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: hans_meiser
HigH_HawK schrieb:
C:
int main(void)
{
    long nc;
    char ch;
    
    for (nc = 0; ((ch = getchar()) != EOF) && (ch != '\n'); ++nc);

    printf("%.0f\n", nc);

    return 0;
}
Dann allerdings auch den printf() format string anpassen: "%d\n"
:)
 
  • Gefällt mir
Reaktionen: HigH_HawK
Erstmal vielen Dank für die zahlreichen Antworten. AnModellbahnerTT auf die leere for-schleife wurde im Buch explizit hingewiesen müsste also gehen da alles in den Klammern enthalten ist und das semicolon abschließt. Die anderen Antworten verstehe ich leider nur z.T. mir ist noch nicht so ganz klar was das EOF bedeutet. Das Buch sagt dazu: "The solution is that getchar returns a distinctive value when there is no more input, a value that cannot be confused with any real character. This value is called EOF,for 'end of file.' " Wenn das so stimmt müsste das Programm funktionieren. Mir scheint, dass es sich hierbei ums Problem handelt und sorry für den double der wird wohl benutzt das der Counter "größer" ist
Ergänzung ()

das Programm müsste ja so laufen: schauen ob ein char eingegeben wurde wenn ja nc + 1 wenn nicht kommt EOF und die Schleife wird folglich nicht ausgeführt. Und strg + d zeigt auch leider keine wirkung in der Konsole.
 
Probier' mal RETURN und dann STRG+D und dann wieder RETURN.

EOF ist ein wert, den die stdio library Funktionen zurueckgeben, wenn versucht wird etwas zu lesen, aber nichts mehr da ist. Das wird typisch bei Datei-I/O benutzt. Tastaturen haben halt keine "Ich hab nix mehr" Funktion, aber STRG+D simuliert diese (manche Betriebssysteme benutzen STRG+Z).

Erweitere mal die Bedingung im for() loop wie ich oben aufgezeigt habe, dann wird RETURN das Programm zur Ausgabe bringen.
 
Ja ich habs jetzt mit deinem Programm versucht. beim ersten Enter kommt eine 0 dann steht da drücken sie eine beliebige Taste wobei sich die Konsole dabei beendet. ich bin mir nun recht sicher das es sich um ein VS/Windows Problem handelt
Ergänzung ()

https://www.tutorialspoint.com/compile_c_online.php
auf dieser seite funktionieren die PRogramme so mehr oder weniger
 
Zuletzt bearbeitet:
Ich verstehe nicht, was da von Sachen geht.
Wenn ich jetzt den code nehme, den ich vorher gezeigt habe, laeuft das alles.
Ich benutze VS 2017, hab' flott ein C++ Console Project (habe keine Deutsche IDE) angelegt, den Code rein (musste "int main(void") angeben, Compiler motzte), und dann lief das einwandfrei. Screenshot angehaengt.
 

Anhänge

  • 2018-08-03_1330.png
    2018-08-03_1330.png
    3,8 KB · Aufrufe: 388
:confused_alt:hm äußerst eigenartig. Hab ein bisschen weiter gearbeitet und ein Zeilentrenn Programm geschrieben bei dem es ohne Probleme geht: also erst Eingabe und wenn man Enter drückt wird nach jedem Wort ein Umbruch eingefügt

PS:Ich glaube im Buch wird vorerst nur main() verwendet um es simpel zu halten (erstes Kapitel halt) hat bei mir auch funktioniert.
Ergänzung ()

Was hast du alles ausgewählt beim installieren von Visual Studio?
Ergänzung ()

Und ich habe mein C Programm so erstellt wie es in diesem Video erklärt wird
Ergänzung ()

ok habe nun nochmal ein neues Projekt erstellt und jetzt klappt alles. Frag mich aber nicht wieso:rolleyes:
eventuell hat es ctrl + Z gebracht aber mittlerweile reicht auch nurnoch Enter.
Noch mal vielen Dank für die Hilfe!
 

Anhänge

  • Programm.PNG
    Programm.PNG
    47,5 KB · Aufrufe: 433
  • Programm.PNG
    Programm.PNG
    39,5 KB · Aufrufe: 448
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: hans_meiser
Zurück
Oben