C Bestimmte Zeichen aus getchar() auslesen und Zählen

T

TerrorTeddy

Gast
Hallo,

Irgendwie stehe ich gerade auf dem Schlauch, ich soll ein Programm schreiben was bestimmte Zeichen aus der Eingabe Zählt und am Ende die Summe angeben.

Ich habe nun ein Programm geschrieben, was erst abfragt welcher Buchstabe / Zahl gezählt werden soll und bekomme es nicht hin es so zu schreiben das er die bedingungen akzeptiert.


Hier das Programm :

#include <stdio.h>
#include <stdlib.h>

int main() {
char a, c;
int zaehler = 0;

printf("Welchen Buchstaben moechten Sie zaehlen? ");
a = getc(stdin);

while( (c = getchar()) !=EOF) {

if (c == a) zaehler++;

}

// Letzte Zeile ausgeben
printf("Zeichen %c kommt %i mal vor.\n", a, zaehler);


return EXIT_SUCCESS;
}

Die genaue Aufgabenstellung erfordert den Abbruch durch STRG+Z (EOF) und eine Kontrollstruktur (?)
( Bedingung wären die Zeichen 3 5 a b
Kann mir jemand kurz helfen -.-
 
Zuletzt bearbeitet:
Das Problem bei deinem Programm ist, das du in der while Schleife die Variable belegst und somit auf der linken Seite des Vergleiches (!= EOF) eigentlich nichts steht wenn ich mich nicht irre, denn eine Zuweisung gibt ja keinen Wert zurück.
Anders würde es aussehen, wenn du nur getchar() in die Whileschleife schreibst, allerdings kannst du dann den soeben verglichenen Character nicht mehr verwenden, da er beim nächsten Aufruf von getchar schon den nächste nimmt.

Verwende am besten eine do-while Schleife, da der Inhalt ja mindestens einmal ausgeführt werden soll und schreibe in der Whileschleife das Ergebnis deines Readvorgangs in eine Variable, mit der kannst du dann arbeiten.

Kann in etwa so aussehen:

Code:
do {

scanf("%c", &read); //scanf variante
//read = getchar(); //getchar variante
if (read == "gewünschteszeichen") counter++;

} while (read != bedingung);

printf("%d", counter);
 
Zuletzt bearbeitet:
Ich brauch für die Bedingung mehrere nämlich 3 5 a b

scanF haben wir bisher noch gar nicht benutzt, deshalb kam ich auf diese Lösung :D
 
Naja du kannst in der Whileschleife ja beliebig viele if-Abfragen einbauen.
Ich hab den Post oben jetzt nochmal editiert mit einer kleinen Erklärung warum ich glaube, dass dein Programm nicht hinhaut.

Code:
do {

if (read == ... ) counterA++;
if (read == ... ) counterB++;
//usw ..

} while ( read != .. )
Besser würde sich hier allerdings ein Switch eignen ;)
 
hab das in meiner nicht hinbekommen, (also mehrere If anweisungen) liegt vll. daran das ich nicht den Counter benutzt habe sondern ne spezielle Variable zum Zaehlen :D


Do while hatten wir auch noch nicht kenne es aber aus Basic heraus.

Sprich meine a Variable würde wegfallen, dafür müsste ich für read = getchar() das read als Variable festlegen .
 
Nichts falsch verstehen, das sind nur Codeschnipsel.
Counter ist in meinem Fall auch nur eine int Variable ;)

read und counter ist in meinem Fall eine Variable.
Falls du die Zeichen, die gezählt werden, nicht hardgecoded werden sollen, musst du dafür davor auch noch eine Abfrage bauen (so wie dus hattest mit deiner Variable a).
Aber ich würd dir empfehlen, sprechendere Variablennamen zu verwenden, sonst werden spätere Programme sehr verwirrend ;)

Eine do-while ist in diesem Fall nicht zwingend, du kannst auch einfach vor der while schleife das erste Mal scanf/getchar aufrufen und in read abspeichern, allerdings brauchst dus dann in der Schleife halt nochmal und bei do-while fällt das halt weg.
Ist im Prinzip schon Optimierung :P

PS: Dein Programmansatz war schon nicht schlecht, wie oben geschrieben liegt der Fehler darin, dass du IN der Bedingung der Whileschleife deine Variable definierst.
Lagere diese Definition aus und es sollte funktionieren :)
 
Zuletzt bearbeitet:
Okay ich probiere das mal ohne Do, die sind sehr Streng in ihrer Auslegung bei uns , und alles muss "exakt" mit dem gemacht werden was wir vorher als Stoff hatten.

Sprich ich versuche jetzt mal scanF einzubauen for der schleife das dann in der Variable read speichern (die dürfte Char sein dann gel? ) und dann darauf die Abfrage bauen

we will see if it works :D
 
@oetzn: Hier ist ein kleines Testprogramm für dich, sag mir mal was rauskommt:
Code:
#include <stdio.h>

int main()
{
	int a = 7;

	printf( "a = %d\n", a );

	if( ( a = 4 ) != 7 )
	{
		printf( "a = %d\n", a );
	}
	
	return 0;
}

Bevor du wilde Behauptungen anstellst, solltest du vielleicht mal testen ob das auch stimmt, was du sagst.

@TerrorTeddy: Dein Code aus deinem ersten Post funktioniert einwandfrei, ich verstehe nicht wo dein Problem liegt!

Gruß
BlackMark
 
Das es funktioniert weiß ich ;)

Aber ich muss es eben abändern.

Ich muss quasi nicht abfragen welche Buchstaben gezählt werden sollen, sondern diese Festlegen sprich
Zahl 1 = 3
Zahl 2 = 5
Buchstabe1 = e
Buchstabe2 = g

Anhand dieser Information muss mein Programm den eingebenen String (getchar) analysieren und die Buchstaben zusammenzählen, sprich wenn der string 35eg enthält würde 4 als Ergebnis erscheinen.

Derzeit kann mein Programm ja nur eine Zahl analysieren.

Wenn ich c = getchar vor die schleife setze funktioniert mein Programm nicht mehr ?! -.-
Ergänzung ()

Brauche hilfe, ich bekomme auch mit den Tipps die Mehrfachabfrage nach den Buchstaben nicht hin -.-
 
Zuletzt bearbeitet:
Wenn ich c = getchar vor die schleife setze funktioniert mein Programm nicht mehr ?!
getchar() macht genau das, was sein Name andeutet. Es holt sich ein char aus dem Eingabestream. Wenn du getchar() vor die Schleife setzt, dann holt sich getchar() das erste char und dann wird die Schleife ausgeführt, alle weiteren chars die im Eingabestrom sind werden nie geholt! Die Schleife muss ja jedes char aus dem Eingabestrom analysieren und zählen, bis eben EOF kommt, also musst du bei jedem Schleifendurchlauf getchar() aufrufen.

Wenn du mehrere Buchstaben zählen willst, dann legst du dir mehrere Abfragen an, aber zählst sie mit der gleichen Zählervariable. Oder du verwendest einzelne Zählervariablen und addierst sie am Ende, kommt das Gleiche heraus.

Wenn du etwas nicht hinbekommst, zeig uns wie du es versucht hast, also poste den Code, den du hast.

Gruß
BlackMark
 
Ich bin jetzt wieder bei dem Code oben, da nichts geklappt hat -.- dabei ist es nur ne kleinigkeit und ich bin zu doof es zu sehen >.<


da ich meinen

a = getc(stdin) ;

nicht mit

scanF("", a );

austauschen kann -.-

Kann mir nicht jemand sagen wie ich aus einem Prüfungsbuchstaben einfach 4 Machen kann? -.-

Also kurz :

Ich will

printf(" Welchen Buchstaben moechten Sie zaehlen? ");
a = getc(stdin);

das ersetzen in dem ich einfach feste Variablen vorgebe.
sprich

a = 0 (so das ich nur prüfen muss c== a ; c ==b ; c==c )

aber er meckert da er die Variablen nicht so akzeptiert -.-

Code ist unverändert da ich es nicht verstehe nochmal ...

#include <stdio.h>
#include <stdlib.h>

int main() {
char a, c;
int zaehler = 0;
int b = 1;
int j = 5;



printf(" Welchen Buchstaben moechten Sie zaehlen? ");
a = getc(stdin);




while( (c = getchar()) !=EOF) {

if (c == b) zaehler++;
if (c == j) zaehler++;

}
printf("Zeichen %c kommt %i mal vor.\n", a, zaehler);

return EXIT_SUCCESS;

}

Int b und Int j sollten zur Prüfung genutzt werden, werden sie allerdings einfach nciht...
 
Zuletzt bearbeitet:
Ich bin jetzt wieder bei dem Code oben, da nichts geklappt hat
Wie wäre es denn, wenn du uns zeigst was nicht klappt. Was soll ich denn machen? Gedankenlesen? Zeig deinen Code her, der nicht klappt und wir können dir sagen warum es nicht klappt!

Hä?
Die Variante von oetzn war ja schon schrecklich ( scanf("", &read); ), aber deine ist noch schlimmer.
Vergiss mal scanf(), das brauchst du für dein Problem nicht und du hast noch nicht gelernt wie man es verwendet, also lass es.

Kann mir nicht jemand sagen wie ich aus einem Prüfungsbuchstaben einfach 4 Machen kann?
Wenn du die Variablen fest machen willst, dann mach das doch.
Code:
char a = 'g';
char b = '7';
char c = 'i';
Wenn du sie alle abfragen willst, dann schreib einfach deine jetzige Eingabe für so viele Variablen wie du brauchst.
Code:
printf(" Welchen 1. Buchstaben moechten Sie zaehlen? ");
a = getchar();

printf(" Welchen 2. Buchstaben moechten Sie zaehlen? ");
b = getchar();
Nur so nebenbei, die Referenz zu getchar() sagt: "It is equivalent to calling getc with stdin as argument." Also kannst du gleich getchar() verwenden.

Edit:
So jetzt hast du Code gepostet, also vergiss den Teil von mir.

int ist eine Ganze Zahl! Die Überprüfung findet sehr wohl statt und es wird geprüft ob c gleich 1 oder gleich 5 ist. Tja, wenn du dir den ASCII-Table ansiehst wirst du schnell festsellen, dass dir weder 1 noch 5 viel bringt. Du willst ja nicht Zahlen vergleichen, sonder Zeichen, also nimm dir ein char und kein int! Zeichen werden intern als Zahlen gespeichert und welche Zahl welchem Zeichen entspricht zeigt dir die ASCII-Tabelle. Du kannst natürlich ein int nehmen und es mit c vergleichen, aber du solltest wenn du zwei Zeichen vergleichen willst char nehmen.

Gruß
BlackMark
 
Zuletzt bearbeitet:
also ich habe nun ne Lösung indem ich die gesamte Abfrage vorher rausgenommen habe.


Wäre damit denn die Aufgabe erfüllt


#include <stdio.h>
#include <stdlib.h>

int main() {
char a, c;
int zaehler = 0;
char Prüfa = 'a';
char PrüfB = 'B';





while( (c = getchar()) !=EOF) {


if (c == Prüfa ) zaehler++;
if (c == PrüfB ) zaehler++;
}
printf("Zeichen %c kommt %i mal vor.\n", c, zaehler);

return EXIT_SUCCESS;

Char a kann ich natürlich nun entfernen.

Aufgabe war :
1. Eingabe von Tastastur Zeichenweise einlesen
- Sollte erfüllt sein durch die while Schleife mit getchar ?
2. Eingabe soll durch STRG+Z abgebrochen werden
- EOF
3. Eingelesener Text soll daraufhinuntersucht werden wie oft jedes Zeichen "a" "B" und "3" und "7" auftritt.
- 3 und 7 muss ich noch hinzufügen
4. Benutzen sie eine Kontrollstruktur die zu dieser Problemstellung paßt und geben sie die Ergebnisse ihrer Zählung aus.
- was zur Hölle ist mit einer Kontrollstruktur gemeint ? (find den Begriff in meinen Unterlagen nicht mal -.- )
 
Zuletzt bearbeitet:
ansonsten nimmt er das bei mir aber nicht :D was soll denn da ansonsten hin?

Gut dann sind Kontrollstrukturen auch vorhanden durch die If ( Bedingung ) dann anweisung


Er meckert bei folgendem Term :

char PrüfB = B;

unterstrichen wird das letzte B "Error : Der Bezeichner ""B"" ist nicht definiert.
 
Zuletzt bearbeitet:
Was? Weißt du was ein Umlaut ist? Du darfst die Variable nicht mit ü benennen!
Nenn sie wie du willst, aber keine Umlaute! Zum Beispiel:
Code:
char CheckA = 'a';

Edit:
Natürlich weigert er sich das zu akzeptieren, weil du einer Variable eine andere Variable zuweist, die es aber nicht gibt. Du hast die Variable B nirgens definiert! Und mach endlich das ü weg!

Gruß
BlackMark
 
Zuletzt bearbeitet:
achsooo ...

Haben wir bisher immer gemacht sry steh derzeit was auf dem Schlauch >.<


Sry hab es einfach nicht mehr gerafft -.- nu hab ich noch eine Aufgabe vor mir, dafür muss ich aber erstmal ordentlich das Buch wälzen


VIELEN DANK !!!
 
Zuletzt bearbeitet:
Möchte hier trotzdem nochmal meinen Senf dazugeben.
1. Ich dachte sein Code funktioniert nicht, daher hab ich eine Vermutung angestellt, warum er nicht funktionieren könnte. Ich verwende die obige Schreibweise nicht, da sie die Leserlichkeit eines Programms (gerade, wenn man erst anfängt) nicht sonderlich verbessern.
Sachen ineinander verschachteln und Zeilen "sparen" tut man erst, wenn das Programm mal grundlegend funktioniert. So habens wir zumindest gelernt und ich finds andersherum auch nicht sonderlich vernünftig.

2. @scanf vs getchar
(Ich seh grad, ich hatte in der Eile das %c vergessen, ich editier das Mal.)
Was ist so schlimm daran scanf anstelle von getchar zu verwenden?
 
denke weil ich scanF noch nicht kenne , hat er es bemängelt .


Deine Hilfe war ja auch Hilfreich hab es nur nicht hinbekommen, da ich einfach zu verwirrt war.



Eine kleine Frage habe ich noch .


Schaut mal hier gilt das als Funktion ? ( Oder muss man ne Funktion explicit mit void xyz () aufrufen ?

#include<stdio.h>

int Multipliziere(int Zahl1, int Zahl2) {
return (Zahl1 * Zahl2);
}

int main() {
int summe = Multipliziere(3, 7);
printf("Das Produkt von 3 und 7 ist %d\n", summe);
return 0;
}
 
Was du vor die Funktionsdefinition schreibst, also int, char, void etc bestimmt nur den Rückgabewert.
Void steht für keinen Rückgabewert, int für Integer usw ..

So wie du dein Programm geschrieben hast, passt das schon, mit der Kleinigkeit, dass eine Multiplikation ein Produkt ergibt und keine Summe ;)

Aufgerufen wird eine Funktion genauso wie dus gemacht hast, falls sie einen Rückgabewert hat.
Also myVar = myFunction(myPar);
Ist eine Funktion mit void definitiert, so hat sie keinen Rückgabewert und wird demnach so aufgerufen, kann aber trotzdem Parameter haben. Wozu das gut ist werdet ihr noch lernen (Zeiger zb):
myFunction(myPar);

Daher steht vor der main-Funktion auch immer int, weil sie an die Funktion, von der sie aufgerufen wurde, im Fall der main() das Betriebsystem, einen Integer zurückgibt. (zB eben 0, falls alles gut gelaufen ist.)
 
Zuletzt bearbeitet:
Zurück
Oben