Problem in C mit einem Programm zum Zeichen zählen
-
Wenn du das so machen willst kannst du das ja nicht ein beliebigen Text eingeben
wenn du die Index im int myArry selbst bestimmst.und außerdem zählt er dir doch bei der while sache nur ein zeichen. Das muss man doch mit einer Schleife lösen.
Ob das was du machst einfach er ist weiß ich nicht, weil ich versteh das nicht
dafür aber das was ich gemacht habe^^
Lg
-
schade eigentlich und ich hab mir so viel mühe beim erklären gegeben
-
TeamNoX schrieb:
Jedoch bekomme ich keine Ausgabe.
dann ist 'anzTreffer' höchstwahrscheinlich 0, d.h. deine einlesefunktion ist wohl verbuggt.
-
na ja, verbugt ist schon ganz richtig
klar ist, dass man das wesentlich "schöner" u. letztendlich auch kürzer bzw. weniger fehlerträchtig machen könnte.
Trotzdem war der Grundgedanke ok, sodaß ich mir den code mal angeschaut habe ( lerne grad selbst mal wieder etwas c aus spass an der freudvorab erstmal, die Lösung ist immer noch nicht korrekt i.S. der Aufgabenstellung aber es gibt schon mal eine halbwegs korrekte Ausgabe, hier erstmal eine "verbesserte" Version:
#include <string.h> #include <stdio.h> char intToChar(int); void Einlesen(char *treffer,int *anzTreffer); void printTable(char *treffer, int *anzTreffer); int main(){ char treffer[256]; int anzTreffer[256]; for (int i=0;i<256;i++){ treffer[i]=' '; anzTreffer[i]=0; } Einlesen(treffer, anzTreffer); printTable(treffer,anzTreffer); return 0; } char intToChar(int i){ char c; if (i<256) { c=(char)i; return c; } return '\n'; } void Einlesen(char *treffer,int *anzTreffer){ char kette[151]; int i; int j; int c; printf("Bitte Zeichenkette (max.150) eingeben: "); fgets(kette ,151,stdin); for (i = 15; i < 256; i++) { c=intToChar(i); for (j = 0;j <strlen(kette);j++) { if(c==kette[j]) { anzTreffer[i]++; treffer[i]=c; } } } } void printTable(char *treffer, int *anzTreffer){ int i; for (i=15; i <=256-4; i+=4) { //if(anzTreffer!=0) printf("%c %i | %c %i | %c %i | %c %i \n", treffer[i], anzTreffer[i], treffer[i+1], anzTreffer[i+1], treffer[i+2], anzTreffer[i+2], treffer[i+3], anzTreffer[i+3]); } }
die gefundenen "Macken" bisher:
- bei mir hat schon der Compiler gestreikt, weil der Aufruf der Methode printTable nicht mit den korrekten Parametern erfolgte.
- wenn man Arrays benutzt, sollte man sie sicherheitshalber als erstes initialisieren
- die Ausgabefunktion gibt 4 Felder auf einmal aus, deshalb i+=4 im Scheifenrumpf, auch die Abbruchbedingung muss entspr. angepasst werden
- scanf liest nur bis zum ersten whitespace ( z.b. leerzeichen) ein, deshalb hab ich fgets benutzt ( es sollen ja alle character gezaehlt werden, also auch spaces )
- der erste char der eingabe ist kette[0] nicht kette[1]was noch offen ist: es sollen groß-/kleinbuchstaben äquivalent sein/gezaehlt werden
- die zeichen <= 13 sollen zwar als space dargestellt, aber vermutlich trotzdem gezaehlt werden
- das zeichen selbst soll im hexcode ausgegeben werdenansonsten ist die Funktion zum umwandeln von int-> char relativ überflüssig, das muesste mit einem simplen Cast von int auf unsigned char auch funktionieren.
greetz,
olli
-
kermitaner schrieb:
was noch offen ist: es sollen groß-/kleinbuchstaben äquivalent sein/gezaehlt werden
nimmst du 'toupper()' oder 'tolower()' um alles gross oder klein zu machen.
kermitaner schrieb:
- die zeichen <= 13 sollen zwar als space dargestellt, aber vermutlich trotzdem gezaehlt werden
naja, if (zeichen <=13) zeichen = ' ';
kermitaner schrieb:
- das zeichen selbst soll im hexcode ausgegeben werden
das geht mit printf und '%x', z.b.: printf ("%02x", zeichen);
-
Hey,
genau solche Antworten wollte ich die sich auf meinen Quellcode beziehen.
Weil ich denke Programmieren ist ein Stück Weit "Kunst" jeder macht es anders.Das mit der Hex Ausgabe funktioniert nicht so wirklich.
void printTable(char *treffer, int *anzTreffer)
{
int i;
for (i=15; i <=256-4; i+=4)
{
if(anzTreffer!=0)
printf("%c %i | %c %i | %c %i | %c %i \n", treffer[i], anzTreffer[i], treffer[i+1], anzTreffer[i+1], treffer[i+2], anzTreffer[i+2], treffer[i+3], anzTreffer[i+3]);
}
}
Da müsste man ja noch ein Parameter übergeben oder? Oder wie kann ich das realisieren.Und zu der Groß und Kleinschreibung.
Muss ich die Fuktion selber schreiben?
Ich brauch ja eig nur eine und zwar die GroßzuKlein Buchstabe.Hier ist nochmal die Aufgabe Detailiert:
http://public.beuth-hochschule.de/~kempfer/2009ws2010/ueb10/ueb10.pdf
edit: unten im Link ist ein Beispiel wie es aussehen soll.achso und was noch fehlt ist das nur die zeichen angezeigt werden die auch nur vorhanden sind
vielen Dank nochmal für die Hilfe
Lg
-
TeamNoX schrieb:
Das mit der Hex Ausgabe funktioniert nicht so wirklich.
void printTable(char *treffer, int *anzTreffer)
{
int i;
for (i=15; i <=256-4; i+=4)
{
if(anzTreffer!=0)
printf("%c %i | %c %i | %c %i | %c %i \n", treffer[i], anzTreffer[i], treffer[i+1], anzTreffer[i+1], treffer[i+2], anzTreffer[i+2], treffer[i+3], anzTreffer[i+3]);
}
}ersetze er mal diese ganzen %c gegen %02x.
TeamNoX schrieb:
Und zu der Groß und Kleinschreibung.
Muss ich die Fuktion selber schreiben?nee, die gibts schon fertig: http://www.cplusplus.com/reference/clibrary/cctype/tolower/
-
na ja, weils anscheinend pressiert ( Abgabe spätestens 22.1
hier mal die ausgabevoid printTable(char *treffer, int *anzTreffer){ int i,spalte=0; char c2; printf("|-------------------------------------------------------|\n|"); for (i=0; i <=255; i++) { if(anzTreffer[i]>0){ c2=(treffer[i]>' ')?treffer[i]:' '; printf(" %c (0x%02X): %d |",c2,i,anzTreffer[i]); spalte++; if(spalte>=4){ printf("\n|"); spalte=0; } } } //rest der letzten zeile ausgeben, falls noetig if (spalte>0){ for (i=spalte;i<4;i++){ printf(" |"); } printf("\n"); } printf("|-------------------------------------------------------|\n"); }
kleiner tipp noch, in der windows dos box kann man mit "Alt"+ziffern (3 stellig) ueber numblock den asci code direkt eingeben, so kann man pruefen, ob auch das zeichen #255 korrekt erkannt u. gezaehlt wird.
wenn nix eingegeben wird, wird aber noch ein "|" zuviel ausgegeben, das könnte man auch noch wegoptimieren, oder man zaehlt den zeilenumbruch "\n" generell mit
-
^^also die formatierung von dem code ist ja wohl gruselig. rück den mal vernünftig ein, öffnende { in die nächste zeile und so. so mag das ja keiner lesen. *fg*
-
Naja ich denke jedem seins
Gibt ja keinen offiziellen Standart oder?
Was macht denn die Zeile.
Die versteh ich nicht so ganz.c2=(treffer[i]>' ')?treffer[i]:' ';
Des weitern habe ich die Funktion tolower eingesetzt hier in der Einlesen Funktion.
void Einlesen(char *treffer,int *anzTreffer) { char kette[151]; int i; int j; int c; printf("Bitte Zeichenkette (max.150) eingeben: "); fgets(kette ,151,stdin); for (i = 15; i < 256; i++) { c=intToChar(i); while (kette[i]) { c=kette[i]; putchar (tolower(c)); i++; } for (j = 0;j <strlen(kette);j++) { if(c==kette[j]) { anzTreffer[i]++; treffer[i]=c; } } } }
Aber er macht mir die nicht groß. Die Funktion muss doch das Arry kette durchgehen und jeden eingegeben Buchstaben klein umwandeln oder?
Oder wo muss ich sie einsetzen?Lg
-
TeamNoX schrieb:
Naja ich denke jedem seins
Gibt ja keinen offiziellen stan**** oder?
nein aber es gibt definitive nogo's
-
du meinst mit den { direkt hinter der anweisung?
alsoif (a>b) {
?
Weil sonst fällt mir nichts an der Formatierung von kermitaner.
Macht auch 3 Leerzeichen immer usw.Lg
-
sowas zum beispiel
for (i=spalte;i<4;i++){ printf(" |"); } printf("\n"); //oder int i,spalte=0; char c2; //oder } printf("|-------------------------------------------------------|\n"); }
egal welchen stil man verwendet das lässt dir keiner durchgehen...
außer er ist masochist, solls ja auch gebenlg lolo
-
naja ich konnte es lesen ^^
das reicht.Aber du könntest du mir helfen bei dieser toLower Sache.
Das will er mir nicht so richtig machen.Lg
-
Aber du könntest du mir helfen bei dieser toLower Sache.
Das will er mir nicht so richtig machen.kette[i]=tolower(kette[i]);
falls du dich fragst wie so ein code dann ausschauen muß damit einem da richtig einer ab geht :p
http://www0.us.ioccc.org/years.html
also entweder ganz oder gar nicht in deinem fall eher garnicht
-
TeamNoX schrieb:
Was macht denn die Zeile.
Die versteh ich nicht so ganz.c2=(treffer[i]>' ')?treffer[i]:' ';
das ist so'ne kurzschreibweise für:
if (treffer[i] > ' ') c2 = treffer[i]; else c2 = ' ';
^^naja, eigentlich wäre eine funktion der bessere ersatz. das 'conditional' ist sozusagen ein 'if'-ausdruck mit rückgabewert, aber egal, das spielt hier keine geige.
TeamNoX schrieb:
Des weitern habe ich die Funktion tolower eingesetzt hier in der Einlesen Funktion.
...
Aber er macht mir die nicht groß.
tolower() macht ja auch alles klein. mit toupper() machste alles gross.
-
noobLolo schrieb:
kette[i]=tolower(kette[i]);
Und wohin muss das?
edit:
das mit dem i hat mich irritiert
es muss j heißen.
void Einlesen(char *treffer,int *anzTreffer) { char kette[151]; int i; int j; int c; printf("Bitte Zeichenkette (max.150) eingeben: "); fgets(kette ,151,stdin); for (i = 15; i < 256; i++) { c=intToChar(i); for (j = 0;j <strlen(kette);j++) { kette[j]=tolower(kette[j]); if(c==kette[j]) { anzTreffer[i]++; treffer[i]=c; } } } }
Lg
-
Es gibt aber noch ein Problem.
Er macht mir macht mir Ä Ö Ü nicht klein
void printTable(char *treffer, int *anzTreffer) { int i,spalte=0; printf("|-------------------------------------------------------|\n|"); for (i=1; i <=256; i++) { if(anzTreffer[i]>0) { printf("%c (0x%02X): %d |",(unsigned char)i,i,anzTreffer[i]); spalte++; if(spalte>=4) { printf("\n|"); spalte=0; } } } if (spalte>0) { for (i=spalte;i<4;i++) { printf(" |"); } printf("\n"); } printf("|-------------------------------------------------------|\n"); }
void Einlesen(char *treffer,int *anzTreffer) { char kette[150]; int i; int j; int c; printf("Bitte Zeichenkette (max.150) eingeben: "); fgets(kette ,151,stdin); for (i = 15 ; i < 256; i++) { c=intToChar(i); for (j = 0;j <strlen(kette);j++) { kette[j]=tolower(kette[j]); if(c==kette[j]) { anzTreffer[i]++; treffer[i]=c; } } } }
-
Hey ich habe noch eine andere Iddee gehabt.
Ist jetzt auch viel einfacherHier ist der Code dazu.
Nochmal danke für die Hilfe
#include <string.h> #include <stdio.h> #include <ctype.h> char intToChar(int); void Einlesen(char *treffer,int *anzTreffer); void printTable(char *treffer, int *anzTreffer); int askAgain(void); int main() { do { char treffer[256]; int anzTreffer[256]; char weiter; int i=0; for (i;i<256;i++) { treffer[i]=' '; anzTreffer[i]=0; } printf("========================\n"); printf("|| ||\n"); printf("|| Zeichenzaehler ||\n"); printf("|| ||\n"); printf("========================\n"); Einlesen(treffer, anzTreffer); printTable(treffer,anzTreffer); }while (askAgain()); return 0; } char intToChar(int i) { char c; if (i<256) { c=(char)i; return c; } return '\n'; } void Einlesen(char *treffer,int *anzTreffer) { unsigned char kette[151]; int i; int j; int c; do { kette[0] = '\0'; printf("Bitte Zeichenkette (max.150) eingeben: "); scanf("%150[^\n]", kette); clearBuffer(); //fgets(kette ,150,stdin); } while (kette[0] == '\0'); j = 0; while (kette[j] != '\0') { kette[j] = tolower(kette[j]); anzTreffer[kette[j]]++; j++; } /* for (i = 15 ; i < 256; i++) { c=intToChar(i); for (j = 0;j <strlen(kette);j++) { kette[j]=tolower(kette[j]); if(c==kette[j]) { anzTreffer[i]++; treffer[i]=c; } } }*/ } void printTable(char *treffer, int *anzTreffer){ int i,spalte=0; char c2; printf("|-----------------------------------------------------------|\n"); for (i=0; i <=255; i++) { if(anzTreffer[i]>0) { if (i < 32) printf("| "); else printf("| %c ", i); printf("(%#04x):%3d ", i, anzTreffer[i]); spalte++; if(spalte>=4) { printf("|\n"); spalte=0; } } } if (spalte > 0) { for ( ; spalte < 4; spalte++) { printf("| "); } printf("|\n"); } printf("|-----------------------------------------------------------|\n"); } int askAgain() { char weiter; do { printf("Moechten Sie das Programm noch einmal starten (j/n)?"); scanf("%c",&weiter); clearBuffer(); } while(weiter == 'n' && weiter == 'N' && weiter == 'j' && weiter == 'J'); if(weiter == 'n' || weiter == 'N') return 0; return 1; } void clearBuffer() { char dummy; do { scanf("%c", &dummy); } while (dummy != '\n'); }