URL: https://www.overclockers.at/coding-stuff/c_ansi_77160/page_1 - zur Vollversion wechseln!
kann ich hier bei nem problem einfach meinen code herhaun und eine frage dazu stellen? weil ich hab keine prinzipielle frage sondern es geht einfach was net und i weiß nimmer wieso...
klar ... wenns ein codeteil ist und kein projekt ...
ja post halt mal ....
also problemstellung ist: eine txt datei öffnen und nach einem string suchen den der user eingibt. die übergabe etc geht eh nur haut bei mir das suchen net hin. wenn ein wort nur einmal vorkommt gehts. bei 2mal oder doppeten zeichen hintereinander etc hauts net hin. vielleicht sehts ihr woran es liegt.
anmerkung: die ganzen printf sind nur für mich damit ich nachvollziehen kann was das programm tut.
hier die funktion:
Code:suchen(int argc, char *argv[]) { FILE *fileptr; int i,k,l,gefunden=0,stelle=0,laenge=0; char suchstring[265], c; for(i=0;argv[2][i]!='\0';i++) suchstring[i] = argv[2][i]; suchstring[i] = '\0'; printf("%s ist der kjakjfl\n",suchstring); for(i=0;suchstring[i]!='\0';i++) laenge++; fileptr=fopen(argv[1],"r"); if(fileptr==NULL) { printf("Fehler beim Oeffnen \n"); return(-1); } while((c=fgetc(fileptr))!=EOF) {printf("%c ist c\n",c); if(c==suchstring[0]) { printf("ich bins auch%d %s\n",laenge,suchstring); k=0; l=0; for(i=0;i<laenge;i++) { printf("ich bins\n"); if((c=fgetc(fileptr))!=(suchstring[k])) { printf("aktuell: %c \nk ist %d\n\n",c,k); k++; printf("x - %d gef: %d %d\n",l,gefunden,k); } else { l=10; printf("aktuell else: %c\n",c); printf("y - %d gef: %d %d \n",l,gefunden,k); } } if(k==laenge) { gefunden++; } stelle++; } else { stelle++; } } printf("\n\n%d wurden gefunden\n\n",gefunden); }
hab ich das richtig verstanden das das ergebnis "x mal gefunden" zu lauten hat? wenn ja, hab ich dir hier mal eine funktionierende lösung zusammengeschrieben:
Code:#include <windows.h> #include <string.h> #include <stdio.h> int main (int argc, char **argv){ FILE *file_input; unsigned int hits = 0, len; char str_filename[512], str_search[512], str_buffer[512]; char *hit; // die strings für den filenamen und den zu suchenden // strings lasse ich den benutzer in der konsole eingeben. // kann aber auch genauso ein übergebener parameter sein printf ("Filename: "); fgets (str_filename, 512, stdin); strtok (str_filename, "\n"); printf ("String: "); fgets (str_search, 512, stdin); strtok (str_search, "\n"); len = strlen (str_search); file_input = fopen (str_filename, "rt"); if (file_input == 0) return; while (!feof (file_input)) { // die datei wird zeilenweise eingelesen und analysiert, // so lange, bis feof() zutrifft if (fgets (str_buffer, 512, file_input) == 0) break; hit = str_buffer; for ( ;; ) { // die zuvor eingelesene zeile wird mittels strstr() // bis zum ende auf vorkommen des suchstrings durchsucht hit = strstr (hit, str_search); if (hit == 0) break; ++hits; hit+=len; } } fclose (file_input); printf ("\n%d hits\n",hits); getch(); return 0; }
anregung: lt. irc gespräch von gestern nur stdio..
Zitat von Lukianregung: lt. irc gespräch von gestern nur stdio..
ja, leider nur stdio.
das ist eines der probleme...
ärgerlich und umständlich, aber daran solls nicht scheitern
einfach diese funktion statt strstr verwenden (der rest bleibt gleich)
Code:char* mystrstr (const char *input_str, const char *search_str){ BOOL hit; char *ret; unsigned int slen = strlen (search_str), x, y; for (x=0; x<strlen(input_str); x++){ hit = TRUE; for (y=0; y<slen; y++){ if (input_str[x+y] != search_str[y]){ hit = FALSE; break; } else{ ret = &input_str[x]; } } if (hit) break; } if (!hit) return 0; else return ret; }
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025