C getchar - Eingaben Zählen

Yogi666

Lt. Junior Grade Pro
🎂Rätsel-Elite ’12
Registriert
Mai 2004
Beiträge
374
Hallo,
Ich versuche ein Programm zu schreiben, dass die Anzahl der eingegebenen Zeichen von getchar() zählt.
Leider verhält sich getchar unerwartet. Solange ich nicht str+Z eingebe läuft die Funktion weiter, das ist mir bekannt.
Der Zähler springt jedoch immer gleich 2 Stellen sobald ich ein Zeichen eingebe.
Weiß jemand wieso?
Danke im voraus :)
Hier der Code:

/*
* main.c
*
* Created on: 13.12.2009
* Author: yogi
*/
#include <stdio.h>
int getchar(void);

int main(void){

int i = 0;
int c;
/* vorerst ist die Schleife auf 50 Iterationen beschränkt */
for (i=1;i<=50;i=i+1)
{
c=getchar();
printf("\n dies ist Eingabe nr: %d",i-1); /*gibt den Schleifenzähler aus*/

if(c==-1){ /* Bedingung für Abbruch c=-1 bei STRG+Z*/
return 0;

}
}
return 0;
}

/* Die Anzahl der gezählten Zeilen ist doppel so hoch wie zu erwarten, wieso???*/
 
Ich selbst programmiere nicht mit C, aber kann es vlt. sein das GetChar sowohl beim Tastendruck als auch beim Loslassen den Zeichencode übermittelt? Also einmal Tastencode x weil gedrückt und dann wieder Tastencode x weil losgelassen.

/edit: anders:
laut Referenz ließt GetChar ein Zeichen ein und muss mit ENTER beendet werden. Dieses ENTER ist dann direkt dein nächstes Zeichen.

/edit2: hier ein Codeschnipsel, der dir die Idee dazu gibt, wie du auf diese Situation reagieren kannst: http://home.fhtw-berlin.de/~junghans/cref/EXAMPLES/getchar.c
 
Zuletzt bearbeitet:
getchar() liest dir genau ein Zeichen aus der Standard-Eingabe.

Wie diese Zeichen in den Standard-Eingabestrom kommen ist keine Frage von C oder deinem Programm, sondern der Shell in der es läuft (ich nehme mal aus dem Kontext einfach an, es läuft in einer Shell).
Es ist auch aus C-Sicht nicht notwendig, eine Eingabe mit Enter zu beenden. Allerdings gibt i.d.R. die Shell diese Eingabe erst an stdin weiter, wenn Enter gedrückt wurde. Außerdem ist das Enter in jedem Fall nicht das Zeichen, was du dann als nächstes liest (gilt natürlich nur dann, wenn du vor dem Enter auch was eingegeben hast ;-)).

Das Codes für das Drücken und Loslassen von Tasten einzeln übermittelt werden, könnte zwar theoretisch sein, aber das macht meines Wissens nach keine einzige Shell so. Wenn du allerdings z.B. unter Linux bist und die Encoding-Einstellungen der Shell nicht mit dem gesetzten Locale übereinstimmen, oder aber die Shell Multibytezeichen übermittelt, oder oder oder, dann können komische Dinge wie in deinem Fall passieren.
Hast du mal das Zeichen - bzw den Integer-Wert - mal nach jedem gelesenen Zeichen mit ausgegeben? Das könnte aufschlussreich sein. Falls du dann immernoch ratlos bist, mach doch mal ein Minimalbeispiel (10 Zeichen z.B.) mit Ausgabe des Werts von "c" als Integer und poste die Ausgabe deines Programms.

Edith fällt ein:
Bist du vielleicht unter Windows und hast MBCS-Support aktiviert? Dann könnte u.U. für jede gedrückte Taste zwei einzelne Bytes übermittelt werden.
 
Zuletzt bearbeitet:
ka ob du sowas suchst.

Code:
#include <iostream>
#include <string>

using namespace std;

void main() {

	int i = 0;
	char tmpChar;

	do {
		cin.get(tmpChar);
		i++;
	}while(tmpChar != 'e');

	cout << i << endl;

}
 
Zurück
Oben