Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Sonstige Fragen » arrays und strings » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen arrays und strings
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Colakabra
Grünschnabel


Dabei seit: 17.01.2016
Beiträge: 1

arrays und strings Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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);
}
17.01.2016 21:15 Colakabra ist offline E-Mail an Colakabra senden Beiträge von Colakabra suchen Nehmen Sie Colakabra in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

RE: arrays und strings Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 18.01.2016 06:43.

18.01.2016 06:41 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Sonstige Fragen » arrays und strings