Anzahl Grossbuchstaben ermitteln aus einem String
-
Wie der Titel schon sagt, möcht ich die Anzahl Grossbuchstaben des strings ermitteln? Hab mich schon mal dran versucht:
#include <stdio.h> #include <stdlib.h> int main() { char Auswahl; char Text[10]; int i,j; printf("Geben Sie einen Text ein: "); fgets(Text, 10, stdin); printf("\n\nSie haben folgenden Text eingegeben: %s",Text); printf("\nWollen Sie die Anzahl der Grossbuchstaben ermitteln? J/N: "); Auswahl = getch(); switch (Auswahl){ case 'J': case 'j': system("cls"); printf("Die Anzahl der Grossbuchstaben in der Zeichenkette\n\n"); char Grossbuchstaben[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','Ö','É','Ä','À','Ü','È','\0'}; int Anzahl = 0; for(i=0;i<10;i++){ for(j=0;j<33;j++){ if(Text[i] == Grossbuchstaben[Anzahl]) Anzahl++; } } printf("%d",Anzahl); printf("\n\n"); break; case 'N': case 'n': return(0); break; default: system("cls"); break; } system ("PAUSE"); return (0); }
Aber es klappt iwie nicht.. Gehts auch iwie anders? Vll. mit ASCii? Und wie müsst ich das bewerkstelligen? Ich hoffe ihr könnt mir helfen
Achtung: Bin noch Anfänger-seit also nicht all zu streng und haltet euch genau wie möglich, damit ich auch was lernen kann^^
MfG
-
if(Text[i] == Grossbuchstaben[Anzahl])
soll wohl eher
if(Text[i] == Grossbuchstaben[j])
sein.Gewöhn dir auch bitte gleich an, deine Probleme genau zu beschreiben.
Aber es klappt iwie nicht..
Das ist die wohl ungenauest mögliche Beschreibung und kann alles mögliche bedeuten. Und auf Ratespiele haben die meisten Leser keine Lust. Du hattest bloß Glück, dass mir der Fehler sogar schon beim ersten Überfliegen des Beitrags auffiel, daher konnte ich helfen. Und wenn du noch mehr Glück hast, war dies sogar der Fehler den du meintest, aber das kann ich nicht wissen, weil deine Beschreibung dies nicht hergibt.
Dein Programm enthält nämlich noch andere Stellen die nur darauf warten Fehler auszulösen oder dies möglicherweise bereits jetzt tun. Stichworte wären ullterminierung, Arraygröße, Arrayinitialisierung und komische Sachen beim Programmfluss die du offensichtlich irgendwo gesehen hast und nachmachst ohne sie wirklich verstanden zu haben. Aber für eine Detailskritik bin ich im Moment zu müde, das macht bestimmt bald ein anderer Forenleser.
-
Mit isupper(..) kannst du überprüfen ob dein Zeichen ein Großbuchstabe ist.
http://www.cplusplus.com/reference/clibrary/cctype/isupper/Oder solls was selbstgebautes sein?
-
http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
int is_upper(char c) { return (c >= 'A' && c <= 'Z'); }
Edit:
Und aus Langeweile habe ich das gleich noch dazu gebastelt.. :xmas1:#include <stdio.h> #include <string.h> int is_upper(char c) { return (c >= 'A' && c <= 'Z'); } int get_up_num(char *string) { int i, j = 0; for (i = 0; i < strlen(string); ++i) if (is_upper(string[i])) ++j; return j; } int main() { char buffer[0x100]; fgets(buffer, sizeof(buffer), stdin); printf("Count: %i", get_up_num(buffer)); return 0; }
-
return (c >= 'A' && c <= 'Z');
Ganz streng genommen garantiert der Standard nicht, dass ein Zeichensatz benutzt wird, in dem die Großbuchstaben alle aufeinander folgen. Es wird nur garantiert, dass 0-9 in der richtigen Reihenfolge sind. Es gibt historische Gegenbeispiele, da gibt es auch C-Compiler auf den Plattformen.is_upper aus der Standardbibliothek ist da schon portabler.
Beides scheitert jedoch, wenn man auch noch Umlaute & Co dabei haben möchte. Da ist der Ansatz des Threaderstellers schon gut.
Was am Programm das Threaderstellers noch besser werden kann:
- Viel Benutzung von unportablem system(). Man könnte nun natürlich einwenden, dass somit das Programm ohnehin nur in DOS-Konsolen funktioniert und somit ASCII als Zeichensatz feststeht. Dadurch funktioniert dann auch cooky451s Funktion zuverlässig. Bis auf Umlaute. Und vielleicht ist dem Threadersteller nicht klar, dass das Programm hinterher auf anderen Systemen nicht funktioniert.char Grossbuchstaben[] = "ABCD...ZÄÖÜ";
ist eine wesentlich kompaktere Schreibweise für das was jetzt da steht.
- 33 als feste Grenze ist sehr unschön. Mach doch lieber so:
j=0; while(Grossbuchstaben[j]){ if(Text[i] == Grossbuchstaben[j]) ++Anzahl; ++j; } }
-
Problem ist immer noch nicht gelöst..
@Seppj: Mit dem "Es klappt einfach nicht" Meinte ich die Anzahl Grossbuchstaben die am SChluss ausgegeben wird.. Es zeigt eine Falsche Ausgabe an.. Und immer noch..
@cooky und Dude: Ich möchte es ohne Hilfsbibliotheken machen, Danke trotzdem
case 'J': case 'j': system("cls"); printf("Die Anzahl der Grossbuchstaben in der Zeichenkette\n\n"); char Grossbuchstaben[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','Ö','É','Ä','À','Ü','È','\0'}; int Anzahl = 0; for(i=0;i<10;i++){ for(j=0;j<33;j++){ if(Text[i] == Grossbuchstaben[Anzahl]) Anzahl++; } } printf("%d",Anzahl); printf("\n\n"); break;
So das ist mal das wichtigste...
Ich definiere die Anzahl = 0, mache einen ABC Array namens Grossbuchstaben.. so und dann läuft er in die erste Schleife rein.. (insg. wird sie <10 mal durchlaufen) und mit der 2. Schlaufe wird geprüft, ob der eingegebene Text, einen Grossbuchstaben enthält und falls ja, wird Anzahl inkrementiert.. Doch nur stimmt das Ergebnis am SChluss nicht... z.B geb ich OO als Text ein und als Anzahl kommt 7 raus ??
Hoffe ihr könnt mir helfen
-
eMaNu3L schrieb:
@cooky und Dude: Ich möchte es ohne Hilfsbibliotheken machen, Danke trotzdem
Wo sind denn da "Hilfsbibliotheken" nötig?^^
Also stdio.h hilft schon irgendwie bei der Ausgabe aber.. ohne ist auch irgendwie nix oder?^^Ich glaube Du hast die Funktionen da noch nicht so ganz verstanden..
Wobei SeppJ natürlich recht hat falls die Buchstaben nicht alle hintereinanderliegen funktioniert die Lösung nicht, aber davon bin ich jetzt mal ausgegangenEdit:
Hastes mal mit == Grossbuchstaben[j] probiert?
Ist mir beim schnellen lesen nur so aufgefallen^^
-
Die Lösung hat doch SeppJ schon vorgestern (um 01:39:01) gezeigt.
Später hat er noch ein paar Infos zum besseren Stil geschrieben.
-
DirkB schrieb:
Die Lösung hat doch SeppJ schon vorgestern (um 01:39:01) gezeigt.
Später hat er noch ein paar Infos zum besseren Stil geschrieben.Wobei: einen zweiten ganz dicken Hauer habe ich noch übersehen: Die äußere Schleife geht immer bis 10, egal wie lang das Wort ist. abhilfe: Die gleiche wie in meinem vorherigen Beitrag zum schöneren Stil - String so lange durchgehen bis man 0 findet.
-
Daran hätte man erkennen könne ob er es verstanden hat oder nur überredet wurde.
-
SeppJ schrieb:
is_upper aus der Standardbibliothek ist da schon portabler.
Wie schon erwähnt wurde, ist es isupper und nicht is_upper.
-
getch() ist kein Standard C, der Code ist jetzt auch C89, so würde es z.B. gehen, Compilerwarnungen sollten du noch abbauen:
-
Wo sind denn da "Hilfsbibliotheken" nötig?^^
Also stdio.h hilft schon irgendwie bei der Ausgabe aber.. ohne ist auch irgendwie nix oder?^^Ich glaube Du hast die Funktionen da noch nicht so ganz verstanden..
Wobei SeppJ natürlich recht hat falls die Buchstaben nicht alle hintereinanderliegen funktioniert die Lösung nicht, aber davon bin ich jetzt mal ausgegangenGehen wir davon aus, dass sie immer nacheinanderliegen werden, den das ist mal ein nebensächliches Problem, welches später ja noch angeschaut werden kann, wenn das Programm mal die Anzahl Buchstaben auszählen kann...
Und ja ich meinte die Funktion isupper oder is_uppper - egal, ich möchte es ohne dies machen.. -> Ich werde bald einen Eignungstest schreiben und da darf ich
1. Kein Internet benutzen, 2.Keine Hilfsmittel (ausser Compiler) und wenn so eine Problemstellung wie hier kommen "würde", hätte ich isUpper a) wohl nicht grad ausm Kragen rausspucken können b) nicht benützen dürfen..@SeppJ, deine Lösung habe ich natürlich ausprobiert und sie hat nicht geklappt.. Du machst es nur anders, da du ja die Grenzen 33 weglässt..
@Wutz, Jo es klappt jetzt, lags am getch()?
-
Die nicht standardkonforme Funktion getch() kümmert sich lediglich um die stdin-Eingabe und versucht, '\n' als Eingabeende zu umgehen. Auswirkungen auf die eigentliche Berechnung hat sie nicht. Hast du die Verwendung der Funktion strlen gesehen? Präge sie dir ein, du wirst du brauchen.
-
@Wutz aus dir muß man erstmal schlau werden... regst dich über ein "i++" auf und nimmst dann für nen char[] strlen() :p
-
und dann kommts strlen() auch noch in ner schleife.. ich flipp aus °°
-
eMaNu3L schrieb:
@SeppJ, deine Lösung habe ich natürlich ausprobiert und sie hat nicht geklappt.. Du machst es nur anders, da du ja die Grenzen 33 weglässt..
Bitte lies Beiträge vollständig und denke über das gesagte nach. Schnell die Codeschnipsel in Beiträgen überfliegen ohne darüber nachzudenken nützt dir gar nichts. Du hast bereits unzählige gute und richtige Antworten erhalten, bist aber nicht in der Lage diese umzusetzen.
Aus Mitleid eine verkürzte Lösung:
#include <stdio.h> #include <stdlib.h> int main() { char Text[10]; printf("Geben Sie einen Text ein: "); fgets(Text, 10, stdin); printf("\n\nSie haben folgenden Text eingegeben: %s\n",Text); const char Grossbuchstaben[] = "QWERTYUIOPASDFGHJKLZXCVBNM"; unsigned int Anzahl = 0; unsigned int i=0; while (Text[i]) { unsigned int j=0; while(Grossbuchstaben[j]) { if(Text[i] == Grossbuchstaben[j]) ++Anzahl; ++j; } ++i; } printf("Anzahl Großbuchstaben: %d\n",Anzahl); return (0); }
-
Wenn du glaubst, dass isupper (bzw. die komplette ctype.h) nicht zum Standard gehört, irrst du.
Wenn du es allerdings einfach selber machen willst, ist das was anderes