[C] Abbrechen wenn keine Eingabe

myhonor

Mitglied
Wie kann ich abfragen, wenn als Eingabe garnichts drinsteht?

C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 30

struct name
{
   int x;
   int y;
   char name[MAX];
} data[MAX]

typedef struct name KUNDEN;

int main()
{
   char *request = NULL;
   int i;

   request = malloc(MAX * sizeof(char));
   while (1)
   {
      printf("Wer soll gesucht werden: ");
      scanf("%s", request);

      if(*request == NULL)
      {
         printf("Suche wird abgebrochen");
         break;
      }
      else
      {
         for(i = 0; i < MAX; i++)
         //Datenbank wird nach Namen durchsucht und bei treffer abgebrochen
      }
   }
   free(request);
   return 0;
}

Wenn ich einfach nur ENTER drücke, bricht er bei mir nicht die Schleife ab. Stattdessen macht er eine neue Zeile. Nur durch die eingabe von min. 1 Zeichen bricht er ab oder fängt von vorne an, je nachdem, ob er was findet oder nicht.

Bitte um hilfe

mfg myhonor
 
Zuletzt bearbeitet von einem Moderator:
Hab es jetzt so abgefragt:

C++:
getchar();
fgets(request, MAX, stdin);
if(strncmp(request, "\n", 1) == 0)
   free(request);

Schließlich sollte ich keinen Speicherplatz verbrauchen.

Diese Methode funktioniert wunderbar, da er wirklich nur die 1. Stelle im String abfragt und nicht gleich alles durchgeht.
 
Er meinte natürlich
C:
if(*request == *"")
und ist gleichbedeutend mit
C:
if(request[0] == '\0')
aber deine Prüfung ist auch korrekt. Allerdings liegt der Fehler nicht im Programm, sondern im Verständnis Standardeingabe. Diese gibt Leerzeilen nämlich gar nicht an das Programm weiter, sondern filtert sie heraus; dies gilt auch für Zeilen die nur tabs und Leerzeichen enthalten, weil die Eingabezeilen grundsätzlich immer einem trim unterzogen werden, weswegen sie auch nie mit einem Tab oder Blank enden.
Zum Beenden der Eingabe solltest du also am besten ein entsprechendes Kommandowort verwenden.

Außerdem solltest du immer unmittelbar nach einem malloc prüfen, ob der Zeiger nicht NULL ist, d.h. ob tatsächlich Speicher bereitgestellt wurde. Bei deinen paar Bytes ist sehr wahrscheinlich, dass es glückt, aber bei anderen Programmen kann man sich dadurch manchen Absturz ersparen.
 
Deine Variante ist so nicht korrekt, weil sie das erste Zeichen der Eingabe verschludert. Richtig muss es lauten
C:
fgets(request, MAX, stdin);
if(*request == '\n')
Auf diese Weise werden die Strings allerdings nicht getrimmt, das musst du dann von hand machen.
 
Zurück