Zunächst geht es um folgenden Code, womit ein Suchbegriff eingelesen werden soll:
Code: Alles auswählen
char search_for[80];
printf("Search for: ");
scanf("%79s", search_for); // ich hätte fgets(search_for, 80, stdin); gemacht
search_for[strlen(search_for) - 1] = '\0'; // die entscheidende Zeile
find_track(search_for);
- Mit fgets wäre der String garantiert null-terminiert (richtig?)
- Schaut strlen auf den Speicher oder arbeitet es mit der Nullterminierung? In letzterem Fall wäre es ja völlig sinnlos...
- Der Code ist falsch: das letzte Zeichen meines Suchbegriffs wird immer mit '\0' überschrieben.
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
char tracks[][80] = {
"I left my heart in Harvard Med School",
"Newark, Newark ‒ a wonderful town",
"Dancing with a Dork",
"From here to maternity",
"The girl from Iwo Jima",
};
void find_track(char search_for[])
{
int i;
for (i = 0; i < 5; i++) {
if (strstr(tracks[i], search_for)) {
printf("Track %i: '%s'\n", i, tracks[i]);
}
}
}
int main()
{
char search_for[80];
printf("Search for: ");
scanf("%79s", search_for);
int len = strlen(search_for);
printf("%d\n", len);
search_for[len - 1] = '\0';
find_track(search_for);
return 0;
}
Code: Alles auswählen
./text_search
Search for: town
Track 1: 'Newark, Newark ‒ a wonderful town'
Code: Alles auswählen
./text_search
Search for: X
Track 0: 'I left my heart in Harvard Med School'
Track 1: 'Newark, Newark ‒ a wonderful town'
Track 2: 'Dancing with a Dork'
Track 3: 'From here to maternity'
Track 4: 'The girl from Iwo Jima'
Wenn ich das manuelle Terminieren mit '\0' weglasse, muss ich dann fgets verwenden, oder funktioniert es auch mit dem scanf-Ansatz?