» Stringverarbeitung

Frage zu Typumwandlung vor der DivisionNeuen Thread eröffnenNeue Antwort erstellenfgets()-Funktion wird übersprungen
AutorNachricht
Beobachter 
Anmeldedatum: 22.12.2019
Beiträge: 2
22.12.2019, 21:01
zitieren

Hallo

nach verzweifeltem Ausprobieren verschiedener Codes muss ich mich nun an euch wenden.

Meine Aufgabenbestellung besagt, dass ich in einem Satz ein Wort suche. Dabei aber Groß und Kleinschreibung nicht beachtet wird. Zusätlich sollen Zeichen nicht berücksichtigt werden.
Also wenn ich das Wort "Ich" im Satz "i.c.h ich! ich" suche sollte das Programm 3 ausgeben:

Probelm ist nun, dass ich zwar alles was kein Buchstabe ist durch ein leeres Feld ersetzt habe aber das nun immer noch nichts bringt. Gibt es vielleicht eine andere Lösung durch rekursiven Aufruf?

Mein Programm schaut bis jetzt wie folgt aus:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int zaehle_wort(char s [], char w[]){

int i;
char *h;

for (i=0;i<strlen(s); i++){
printf("bin hier\n");
if (s[i]<'a') s[i]+='a'-'A';
if ((s[i]<'a'||s[i]>'z')&&s[i]!='\0'){
s[i]="";

}}

printf("Kartoffel\n");


for (i=0;i<strlen(w); i++){
if (w[i]<'a') w[i]+='a'-'A';
if ((w[i]<'a'||w[i]>'z')&&w[i]!='\0'){
w[i]="";

}}
i=0;
h=strstr(s,w);

printf("%s\n", s);

while(h!=NULL){

i++;
h=strstr(h+1,w);
if(h=='-')h+1;
}

return i;



}

int main()
{
char s[]="Ic h bin ICH, weil ich Ich bin";
char w[]="ICH";


// strcpy(s[1],w);

//s[5]="";

printf("%s\n", s);

printf(" Anzahl ist %i\n", zaehle_wort(s,w));

printf("Hello world!\n");
return 0;
}


Vielen Dank für eure Hilfe im Voraus

lg
Legerias


pn
Trainee 

Name: Mirko
Geschlecht:
Anmeldedatum: 06.12.2019
Beiträge: 46
Wohnort: Weingarten
23.12.2019, 17:03
zitieren

Hallo,

zunächst einmal muss ich ein wenig meckern... :yes:
Du solltest wirklich deinen Code kommentieren. So hat echt niemand Lust sich damit zu beschäftigen. Außerdem solltest Du unbedingt deinen Code formatiert darstellen. Es ist einfach grausam sich das durchlesen zu müssen. Ist wirklich nicht böse gemeint. :)

Ich habe mich mal unabhängig von deiner Lösung mit der Aufgabe beschäftigt. Hat echt spaß gemacht. :D
Eine rekursive Lösung sehe ich hier nicht zwingend. Fände ich bei dieser Aufgabe übertrieben. Ist aber auch oft Geschmacksache. Wenn die Aufgabe es nicht erfordert, würde ich das also nicht tun. Ich poste mal meinen Lösungsvorschlag. Ich bin mir durchaus klar darüber, dass es kürzer bzw. eleganter ginge. Jedoch denke ich, dass es für einen ersten Schuss brauchbar ist.

Vorgegangen bin ich folgendermaßen.
  1. Den String von allem befreien, was keine Buchstaben sind.
  2. Alle Buchstaben in Großbuchstaben umwandeln.
  3. Durch den String iterieren und mit dem Teilstring vergleichen.
Schaue es Dir einfach mal an und vielleicht konnte ich Dir an der einen oder anderen Stelle etwas helfen...


/* findstring.c

/  Zaehlt das Vorkommen eines Teilstrings innerhalb einer Zeichenkette.
/  Gross- und Kleinschreibung wird nicht beachtet.
/  Nur Buchstaben werden beruecksichtigt. Leer- und Sonderzeichen nicht.
*/

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

#define MAX_CHAR_IN_STRING 100

/* Entfernt alle Zeichen, ausser den Buchstaben und ordnet sie lueckenlos
   aneinander. Erwartet die Quell-Zeichenkette als Parameter. */
void reArrangeStr(char *srcStr);

/* Zaehlt wie oft der Teilstring im Quellstring vorkommt.
   Erwartet als Parameter den Quellstring und den Teilstring.
   Rueckgabewert ist die Anzahl des Vorkommens. */
int countPartStr(const char *srcStr, const char *partStr);

int main(void)
{
    /* Quell-Zeichenkette, nicht aenderbar. */
    const char constSrcStr[MAX_CHAR_IN_STRING] =
        "ic h bin ICH, weil ich Ich bin.";

    /* Teilstring, nicht aenderbar. */
    const char constPartStr[MAX_CHAR_IN_STRING] = "ICH";

    /* Veraenderbarer Quellstring. */
    char tmpSrcStr[MAX_CHAR_IN_STRING];

    strcpy(tmpSrcStr, constSrcStr);
    reArrangeStr(tmpSrcStr);

    int i = 0; /* Zaehlvariable fuer Schleife */

    /* Alle Buchstaben im temporaerem String in Grossbuchstaben
       umwandeln. */
    while (tmpSrcStr[i] && i < MAX_CHAR_IN_STRING)
    {
        tmpSrcStr[i] = toupper(tmpSrcStr[i]);
        i++;
    }

    /* Wie oft kommt der Teilstring vor? */
    int amountOfPartString = countPartStr(tmpSrcStr, constPartStr);

    if (amountOfPartString > 0)
    {
        printf("Im Quellstring\n");
        printf("<%s>\n", constSrcStr);
        printf("konnte der Teilstring <%s> ", constPartStr);
        printf("%d Mal gefunden werden.\n", amountOfPartString);
    }
    else if (amountOfPartString == 0)
    {
        printf("\nTeilstring ist im Quellstring nicht vorhanden!\n\n");
    }
    else
    {
        printf("\nFehler! Teilstring ist laenger als der Quellstring!\n\n");
    }

    return 0;
}

void reArrangeStr(char *srcStr)
{
    /* Zum Aufangen der Buchstaben. */
    char tmpStr[MAX_CHAR_IN_STRING];

    int i = 0; /* Zaehlvariable fuer Schleife */
    int j = 0; /* Zaehlvariable fuer temporaeren String */

    while (srcStr[i] && i < MAX_CHAR_IN_STRING)
    {
        /* Ausschliesslich die Buchstaben werden vom Quellstring
           in den temporaeren String geschrieben. */
        if ((srcStr[i] >= 'A' && srcStr[i] <= 'Z') ||
            (srcStr[i] >= 'a' && srcStr[i] <= 'z'))
        {
            tmpStr[j] = srcStr[i];
            j++;
        }

        i++;
    }

    /* Zur Sicherheit bekommt der temporaere String ein NULL_Byte. */
    tmpStr[j] = '\0';

    /* Quell-String wird mit dem temporaerem String ueberschrieben. */
    strcpy(srcStr, tmpStr);
}

int countPartStr(const char *srcStr, const char *partStr)
{
    /* Zum Speichern des Rueckgabewerts, die Anzahl des vorkommenden
       Teilstrings. */
    int amount = 0;

    int lenghtOfSrcStr = strlen(srcStr);
    int lenghtOfPartStr = strlen(partStr);

    if (lenghtOfPartStr > lenghtOfSrcStr)
    {
        /* Rueckgabewert, wenn Teilstring länger ist als der Quellstring. */
        amount = -1;
    }
    else if (lenghtOfPartStr == lenghtOfSrcStr)
    {
        /* Wenn Teilstring und Quellstring gleich lang sind, dann
           koennen beide problemlos miteinander verglichen werden. */
        if (strcmp(srcStr, partStr) == 0)
        {
            amount = 1;
        }
    }
    else
    {
        /* Mit diesem String werden die Vergleiche durchgefuehrt */
        char tmpStr[MAX_CHAR_IN_STRING];

        /* Solange durch den Quellstring iterieren, bis der Teilstring
           beim letzten Durchlauf exakt am Ende des Quellstrings seht. */
        for (int i = 0; i <= lenghtOfSrcStr - lenghtOfPartStr; i++)
        {
            int countTmpStr = 0;

            /* Zeichen mit derselben Laenge wie der Teilstring in den
               temporaeren String kopieren */
            for (int j = i; j < i + lenghtOfPartStr; j++)
            {
                tmpStr[countTmpStr] = srcStr[j];
                countTmpStr++;
            }
     
            tmpStr[countTmpStr] = '\0';

            if (strcmp(tmpStr, partStr) == 0)
            {
                amount++;
            }
        }
    }

    return amount;
}


 1x  bearbeitet
pn
Beobachter 
Anmeldedatum: 22.12.2019
Beiträge: 2
23.12.2019, 23:40
zitieren

Danke dir!!! :D

Da hätte ich ewig gebraucht um darauf zu kommen....

Werde deinen Rat befolgen und absofort darauf aupassen ;).

Liebe Grüße und schöne Festtage!

Legerias ;)


pn
Trainee 

Name: Mirko
Geschlecht:
Anmeldedatum: 06.12.2019
Beiträge: 46
Wohnort: Weingarten
24.12.2019, 08:35
zitieren

...wünsche Dir ebenso schöne Festtage. :yes:

pn
Gast 
24.12.2019, 08:35
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Stringverarbeitung" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neue Antwort erstellen
© 2004 - 2024 www.programmierer-forum.de | Communities | Impressum |