Suchen in einem String - WIE???
-
Hi, ich habe eine Aufgabe, an der ich einfach verzweifel. Ich weiß nicht, was ich falsch mache und was ich noch machen muss.
Die Aufgabenstellung:
http://members.tripod.de/paulhaas/03.pdfmein Programm soweit:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <iostream.h> char wordlength[102] = {' '}; //Liefert einen Buffer, in dem Zeichen gespeichert werden char str[100] /*= {' '}*/; char suchStr[100] /*= {' '}*/; int i = 2; int k = 2; /*------------------------------------------------------------------*/ /*----------------------Anfang Such-String-Funktion-----------------*/ char *findStr(char *str, char *suchStr) { if (suchStr[i] != str[k]) printf ("Begriff wurde nicht gefunden!"); else do { printf ("%c", str[k]); printf (" wurde gefunden\n"); k++; i++; } while (suchStr[i] != str[k]); return (suchStr); } /*------------------------------------------------------------------*/ /*----------------------Ende Such-String-Funktion-------------------*/ /*------------------------------------------------------------------*/ /*----------------------Anfang Hauptprogramm------------------------*/ void main (void) { wordlength[0] = 100; //ist die Anzahl der möglichen eingegebenen Buchstaben printf ("Die vorgegebene Wortkette ist?\n"); for (int j = 0; j < str[1]; ++j); { scanf("%c", &str[k]); /* Einlesen */ while (getchar() != '\n') {}; /* Puffer leeren */ /* Einlesen mit gets() und scanf() */ wordlength[100]; /* Nur sicher wenn Eingabe nicht laenger als 100 Zeichen */ gets(wordlength); //sscanf(wordlength, "%d", &str[k]); } printf ("\n\n"); printf ("Bitte geben Sie ein Wort als Suchbegriff ein!\n\n"); for (int j = 0; j < suchStr[1]; ++j); { scanf("%c", &suchStr[i]); /* Einlesen */ while (getchar() != '\n') {}; /* Puffer leeren */ /* Einlesen mit gets() und scanf() */ wordlength[100]; /* Nur sicher wenn Eingabe nicht laenger als 100 Zeichen */ gets(wordlength); //sscanf(wordlength, "%d", &suchStr[i]); } printf ("\n\n"); findStr(str, suchStr); getch(); } /*------------------------------------------------------------------*/ /*----------------------Ende Hauptprogramm--------------------------*/
Bitte helft mir. Ist echt wichtig!!!
Danke im Voraus...
-
Könntest du bitte noch die Code Tags einfügen? Es wäre auch nicht schlecht, wenn du angibst, auf welcher Seite deine Aufgabe ist.
-
sorry... hab ich vergessen... das war Aufgabe 22
hier habe ich nochma ne überarbeitete Version, die jemand anderes mir vorgeschlagen hat...
funzt aber auch net wie sie soll
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <iostream.h> char wordlength[102] = {' '}; //Liefert einen Buffer, in dem Zeichen gespeichert werden char str[100] /*= {' '}*/; char suchStr[100] /*= {' '}*/; int i = 2; int k = 2; int j; /*------------------------------------------------------------------*/ /*----------------------Anfang Such-String-Funktion-----------------*/ char *findStr(char *str, char *suchStr) { int b; b = 2; for (int a=1; a<=i; a++) { if (str[a] == suchStr[b]) { do { b++; printf("%c %c",str[a+b-1],suchStr[b]); } while (str[a+b-1] == suchStr[b]); if (b == suchStr[0]) { return(&suchStr[a]); } } } } /*------------------------------------------------------------------*/ /*----------------------Ende Such-String-Funktion-------------------*/ /*------------------------------------------------------------------*/ /*----------------------Anfang Hauptprogramm------------------------*/ void main (void) { wordlength[0] = 100; //ist die Anzahl der möglichen eingegebenen Buchstaben printf ("Die vorgegebene Wortkette ist?\n"); for (int j = 0; j < str[1]; ++j); { scanf("%c", &str[k]); /* Einlesen */ while (getchar() != '\n') {}; /* Puffer leeren */ /* Einlesen mit gets() und scanf() */ wordlength[100]; /* Nur sicher wenn Eingabe nicht laenger als 100 Zeichen */ gets(wordlength); //sscanf(wordlength, "%d", &str[k]); i = j; } printf ("\n\n"); printf ("Bitte geben Sie ein Wort als Suchbegriff ein!\n\n"); for (int j = 0; j < suchStr[1]; ++j); { scanf("%c", &suchStr[i]); /* Einlesen */ while (getchar() != '\n') {}; /* Puffer leeren */ /* Einlesen mit gets() und scanf() */ wordlength[100]; /* Nur sicher wenn Eingabe nicht laenger als 100 Zeichen */ gets(wordlength); //sscanf(wordlength, "%d", &suchStr[i]); k = j; } printf ("\n\n"); findStr(str, suchStr); getch(); } /*------------------------------------------------------------------*/ /*----------------------Ende Hauptprogramm--------------------------*/
-
Also mir ist klar, warum das nicht so geht, wie du es erwartest. Schließlich hast du was programmiert, das ein undefiniertes Verhalten hervorruft.
Tipps & Fehler:
1. globale Variablen macht man nur, wenn man sie auch wirklich in mehreren Funktionen verwendet und auch nur dann, wenn es zu umständlich oder zuviel Aufwand wäre, diese Variablen als Parameter zu übergeben. Und wenn man sie verwendet, dann muss man tunlichst darauf aufpassen, dass man nicht lokal den gleichen Namen verwendet! (Wie es bei dir ja der Fall ist -> str)
2. Deine 2 Schleifenbedingungen in main sind falsch. Was bitte schön steht denn in str[1] drin?? Oder in suchStr[1]??? Keine Ahnung? Stimmt, da steht nämlich irgendwas drin. Irgendeine Zahl, die mit j verglichen wird.
3. Was soll die Anweisung wordlength[100];???
4. Wenn du eh getch() bzw. getche() verwenden kanns, warum machst du den Umweg über scanf() und dann noch das komische Leeren des Puffers mit getchar()??? (Mal davon abgesehen, dass getch() und getche() kein ANSI-C Standard ist)
5. Anstatt gets() kann man auch fgets() verwenden, dann gibts kein Problem mehr mit einem Buffer-Overflow. Also anstatt gets() immer fgets()!
So das wars erstmal.
-
zu 2.
ich habe in der C Hilfe was gelesen, dass in [1] eines String Arrays die Länge des Strings drin steht...?!zu 3.
und wordlength [100] soll definieren, dass man 100 Buchstaben eingeben kann...zu 4. + 5.
Ich kann mich selbst wirklich nicht als Experte in Sachen Programmieren bezeichnen.
Daher ist mir nichtmal wirklich klar, wie ich getch() richtig verwende, bzw. wie ich eine Tastatureingabe richtig einlesen kann.
das mit dem Puffer leeren hab ich woher kopiert, weil da stand, dass man das immer machen sollte.
-
hier kleine hilfe
#include <stdio.h> #include <string.h> #define BUF 100 int find_substring(char *str_one, char *str_two) { register int i; char *p_str_one, *p_str_two; for(i=0; str_one[i]; i++) { p_str_one = &str_one[i]; p_str_two = str_two; while(*p_str_two && *p_str_two == *p_str_one) { p_str_one++; p_str_two++; } if (!*p_str_two) return i; } return -1; } int main(int argc, char **argv) { char str_one[BUF], str_two[BUF]; printf("1 string: "); str_one[strlen(fgets(str_one, BUF, stdin))-1] = '\0'; printf("2 string: "); str_two[strlen(fgets(str_two, BUF, stdin))-1] = '\0'; if (find_substring(str_one, str_two) != -1) printf("zeichenkette gefunden position %i\n", find_substring(str_one, str_two)); else printf("zeichenkette nicht gefunden\n"); return 0; }
-
@grido
Gutes Beispiel. Mich stört nur noch, dass du find_substring() zweimal aufrufst, obwohl einmal völlig ausreichen würde (Ergebnis in Variable speichern ;)).Zu 2.: Stimmt definitiv nicht! Die Länge des Strings bekommst du mit strlen(). Dazu muss aber auch ein String im char-Array stehen mit Stringendezeichen ('\0' oder einfach 0). Wenn du wissen willst wieviel Speicher reserviert wurde für das Array, dann musst du sizeof() verwenden.
Allerdings wundert mich das Konstrukt mit den Schleifen sowieso. Was hast du da eigentlich vor? Wenn du nur einen String und einen Suchstring eingeben lassen willst, dann brauchst du eigentlich nur jeweils fgets() aufrufen. Mehr nicht!Zu 3.: So funktioniert das nicht. Der Compiler macht bei dieser Anweisung einfach gar nichts.
Zu 4.: getch() bzw. getche() liest einfach nur ein Zeichen von der Tastatur ein. Im Gegensatz zu getchar() wartet es nicht auf die Eingabe von ENTER. Der Unterschied zwischen getch() und getche() ist nur, dass getche() das Zeichen auch am Bildschirm ausgibt. Aber wie gesagt, getch() und getche() sind kein ANSI-C Standard, d. h. diese Funktionen funktionieren nicht bei jedem Compiler!
Zu 5.: Nochmal genauer: Wenn du einen String mit gets() einliest, dann kann es passieren, dass die Tastatureingabe über den Speicherbereich deiner übergebenen Variable hinausläuft.
Beispiel:
char eingabe[10]; int zahl=5; gets(eingabe);
Wenn der Anwender nun 10 oder mehr Zeichen eingibt auf der Tastatur, dann steht aller Wahrscheinlichkeit nach in zahl nicht mehr 5, weil gets() einfach über den reservierten Bereich von eingabe hinausschreibt. Er schreibt also wild im Speicher rum!
Bei fgets() kannst du die maximale Eingabelänge angeben. Der Anwender kann zwar immer noch mehr Zeichen eingeben auf der Tastatur und es werden auch mehr Zeichen am Bildschirm angezeigt, aber fgets() schreibt nur in den Bereich, den du ihm angibst und nicht drüber hinaus.
-
du hast recht, ich habe es nur als beispiel geschrieben.
-
ja danke schon mal für die Tipps... In der FH benutzen wir aber auch immer getch() am Ende jedes Programms, damit es nicht einfach wieder endet. Von daher sollte es kein Problem sein.
In einer ruhigen Minute muss ich mich nochmal verschärft mit euren Ratschlägen auseinander setzen...