Ich bin neu hier und das ist meine erste Frage.strstr Funktion nicht zurück NULL
Ich habe bereits nach diesem Problem gesucht, aber nichts von dieser Art finden. Also hier geht es.
Ich schreibe ein Menü-basiertes Programm für eine Name-Datenbank, mit 2D-Array von Zeichen. unten ist meine Hauptfunktion.
int main(void)
{
char name[MAX][25] = { 0 };
char choice;
while (1) {
printf("******************menu****************\n");
printf("i: input\n");
printf("p: print\n");
printf("f: find\n");
printf("d: delete\n");
printf("s: sort\n");
printf("e: edit\n");
printf("q: quit\n");
printf("**************************************\n\n");
printf("Enter your choice: ");
scanf(" %c", &choice);
getchar();
switch (choice) {
case 'i':
input(name);
break;
case 'p':
print(name);
break;
case 'f':
find(name);
break;
case 'q':
return 0;
default:
printf("Invalid choice\n");
}
}
}
Eingabe und Druckfunktion funktioniert gut, aber ich habe ein Problem in der Funktion finden. Hier ist es.
void find(char (*p)[25])
{
int i;
char str[25];
if (count == 0) {
printf("Empty database\n");
return;
}
printf("Enter name to search: ");
fgets(str, 25, stdin);
str[strlen(str) - 1] = 0; //Removing new line character at the end of string.
for (i = 0; i < count; i++) {
if (strstr(p[i], str) != NULL); //Breaking the loop, when first occurence is found among all the names.
break;
}
if (i == count) {
printf("Not found\n"); // if loop is not terminated by "break" statement,
// that means strstr returned NULL for all names.
return;
}
printf("Names matching with %s\n", str);
for (i = 0; i < count; i++) {
if (strstr(p[i], str) != NULL); // Again looping to print all the matching names.
puts(p[i]);
}
}
count
ist eine globale Variable hier, die in Eingabefunktion erhöht wird. Die strstr
Funktion gibt immer True zurück, auch wenn ich einen Kauderwelschnamen übergebe. Ich benutze ubuntu 16.04 gcc 5.3.1
Ich habe versucht, mit einem Breakpoint bei strstr
debuggen, empfängt es beide die Zeichenfolgen richtig, aber immer den Zeiger auf Heuhaufen zurück.
53 ../string/strstr.c: Keine solche Datei oder Verzeichnis.
Haystack ist "Imtiyaz"
und Nadel ist "abcd"
und hier ist, was es gibt.
find (p=0x7fffffffdcb0) at name_data.c:126
Ich verstehe nicht, was hier falsch läuft, ist es von meiner Seite?
und eine weitere Sache, zuvor habe ich versucht mit strcasestr()
, aber Compiler wirft eine Warnung "implizite Deklaration", obwohl ich <string.h>
ordnungsgemäß enthalten.
bitte helfen Sie mir.
Edit: Ok Freunde, ich werde die Eingabe-und Druckfunktion auch zeigen, damit Sie Menschen mein Programm richtig analysieren. Was übrigens gut funktioniert.
void input(char (*p)[25])
{
if (count == MAX) {
printf("Memory full\n");
return;
}
printf("Enter name: ");
fgets(p[count], 25, stdin);
p[count][strlen(p[count]) - 1] = 0; //Removing the new line character at the end of string.
count++;
}
void print(char (*p)[25])
{
int i;
if (count == 0) {
printf("Empty database\n");
return;
}
printf("********************************\n");
for (i = 0; i < count; i++) {
printf("%d %s\n", i + 1, p[i]); //printing names with serial numbers.
}
printf("********************************\n");
}
Ich habe noch keine anderen Funktionen implementiert (wie Löschen, Suchen usw.), wie Sie int switch-case sehen können.
zwei der 'if'-Anweisungen haben eine nachstehende'; ', die nicht da sein sollte. Der Code sollte beim Aufruf von 'scanf()' auf Fehler prüfen und beim Aufruf von 'fgets()' – user3629249
beim Kompilieren immer alle Warnmeldungen aktivieren. dann repariere diese Warnungen. – user3629249