arrays und strings

Neue Frage »

Auf diesen Beitrag antworten »
Colakabra arrays und strings

Meine Frage:
Ich sollte ein Programm schreiben, in dem er einen String einliest und dann die einzelnen Buchstaben zählt und als diagramm ausgibt. das war teilaufgabe a. jetzt soll ich b machen.

Erweitern Sie Ihr C-Programm aus Teilaufgabe a). Definieren Sie im Hauptprogramm einen String
char muster[128] = "und"

Die Erweiterung Ihres Programms soll nun die Position (den Index) im String text ermitteln, an der das muster ?und? auftaucht. Vergleichen Sie dazu an jeder Position in text die nachfolgenden 3 Zeichen mit dem muster Das Wort ?und? soll im Stringtext durch Großbuchstaben hervorgehoben werden, binden Sie die header-Datei ctype.h ein und verwenden Sie die dort bereitgestellte Funktion
toupper( char c )
welche für den in c gespeicherten Kleinbuchstaben den zugehörigen Großbuchstaben zurückgibt. Geben Sie die Position des ersten Treffers (erstes Vorkommen von muster in text ) sowie den modifizierten String text aus.



Meine Ideen:
Hier mein Programm, weiß jemand wo der Fehler ist?

#include <stdio.h>
#include <ctype.h>


int n = 1023;
void balkendiagramm( int *a ){
char p;
for ( int j = 0; j <= 25; j++ ){ //Aüßere for-Schleife zum Durchlaufen der Zählindezes des int-Feldes.
p = 'a' + j; //Bei jedem Durchlauf soll der momentane Buchstabe geändert werden zu jedem, der gerade betrachtet wird.
printf("%c: ", p); //Schreibe den im Durchlauf betrachteten Buchstaben vor die Anzahl.
for (int k = 0; k < a[j]; k++) { //Innere for-Schleife zum Ausgeben wieviele Zeichen von den jeweiligen Kleinbuchstaben im Text vorkommen
printf("*"); //Pro vorkommen gebe ein * aus.
}
printf("\n"); //Pro Durchlauf(Kleinbuchstabe) ein Absatz.
}
}

void rueckwaerts_ausgeben(char *text){
if((n>=0 && text[n] <= 'z' && text[n] >= 'a') || (n>=0 && text[n] == ' ')){
printf("%c", text[n]);
n=n-1;
rueckwaerts_ausgeben(text);
} else if ( n >= 0) {
n=n-1;
rueckwaerts_ausgeben(text);
}

}

int main(void){
int a[26]; //Array zum Zählen der Kleinbuchstaben.
char muster[128] = "und";
char text[1024]; //Array welches als Inhalt die einzelnen Zeichen der Zeichenkette enthalten soll.
for (int q = 0; q <= 1024; q++){
text[q]='A'; //Zunächst müssen alle Einträge im Feld ungleich einem Kleinbuchstaben sein, damit hinterher nicht Kleinbuchstaben gezählt werden die garnicht zur Eingebe gehören.
}
for (int j = 0; j <=26 ; j++){ //Setze zunächst alle Zählindexe gleich dem Wert 0, damit hinterher korrekt gezählt werden kann-
a[j]=0;

}
fgets(text, 1024, stdin);
for (int i = 0; i <= 1024; i++){
switch (text[i]){ //switch-case Anweisung zur Ermittlung an welcher Stelle des int-Feldes 1 hinzuaddiert werden soll, um hinterher die Kleinbuchstaben korrekt zu zählen.
case 'a':
a[0]++;
break;
case 'b':
a[1]++;
break;
case 'c':
a[2]++;
break;
case 'd':
a[3]++;
break;
case 'e':
a[4]++;
break;
case 'f':
a[5]++;
break;
case 'g':
a[6]++;
break;
case 'h':
a[7]++;
break;
case 'i':
a[8]++;
break;
case 'j':
a[9]++;
break;
case 'k':
a[10]++;
break;
case 'l':
a[11]++;
break;
case 'm':
a[12]++;
break;
case 'n':
a[13]++;
break;
case 'o':
a[14]++;
break;
case 'p':
a[15]++;
break;
case 'q':
a[16]++;
break;
case 'r':
a[17]++;
break;
case 's':
a[18]++;
break;
case 't':
a[19]++;
break;
case 'u':
a[20]++;
break;
case 'v':
a[21]++;
break;
case 'w':
a[22]++;
break;
case 'x':
a[23]++;
break;
case 'y':
a[24]++;
break;
case 'z':
a[25]++;
break;
}
}
balkendiagramm(a); //Aufruf der Funktion Balkendiagramm.
for (int h = 0; h <= 1024; h++){
if(text[h] == muster[0] && text[h+1]== muster[1] && text[h+2] == muster[2]){
printf("Position des ersten Treffers: %i\n", h+1);
text[h] = toupper(text[h]);
text[h+1] = toupper(text[h+1]);
text[h+2] = toupper(text[h+2]);
break;
}
}
printf("%s\n", text);
rueckwaerts_ausgeben(text);
}
 
Auf diesen Beitrag antworten »
eulerscheZahl RE: arrays und strings

Es wäre einfacher, wenn du vorher erklärst, wie der Fehler sich äußert. Soll ich den jetzt erst noch suchen?
Mein erster Test hat geklappt.

code:
1:
2:
char text[1024];
for (int q = 0; q <= 1024; q++){	

da gehst du eindeutig zu weit, bis in nicht reservierten Speicher. Da strings '\0' terminiert sind, kannst du dir das Füllen mit 'A' sowieso sparen.
In der anschließenden Suche stoppst du dann, wenn in text ein '\0' steht.
Das Problem hast du an mehreren Stellen, auch bei der Buchstabenhäufigkeit (Initialisierung geht auch mit int[26] a = {0}).

Und zu deinem switch Konstrukt:
code:
1:
2:
3:
4:
5:
6:
fgets(text, 1024, stdin);
for (int i = 0; text[i] != '\0'; i++){
	if (text[i] >= 'a' && text[i] <= 'z') {
		a[text[i]-'a']++;
	}
}

Das erspart dir langes Scrollen. Beachte, dass ich die Zahl der Schleifendurchläufe gefixt habe.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »