gets()

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
kubi
Beiträge: 3
Registriert: Di Mai 03, 2022 6:13 pm

gets()

Beitrag von kubi » Di Mai 03, 2022 6:33 pm

Hallo, da meine Suche bei Google und Co. nichts ergeben hat, habe ich mich das erste mal in einem Forum angemeldet. Ich wollte Programmieren lernen und habe mir ein Buch gekauft um es Kapitel für Kapitel durch zuarbeiten. Nun hänge ich schon an einer Stelle, fast noch am Anfang Fest.

Falls es wichtig ist. Ich benutze Linux und compiliere direkt im Terminal.

Also ich habe jetzt diesen Code abgetippt:

Code: Alles auswählen

#include <stdio.h>

int main () {
  char eingabe[100];
  printf("Geben sie einen Text mit maximal 100 Zeichen ein: ");
  gets(eingabe);
  printf("Eingegebener Text: %s", eingabe);
  return 0;
}
Beim compilieren wird das angezeigt:

Code: Alles auswählen

Warnung: Implizite Deklaration der Funktion »gets«; meinten Sie »fgets«? [-Wimplicit-function-declaration]
    8 |   gets(eingabe);
      |   ^~~~
      |   fgets
/usr/bin/ld: /tmp/ccGMhTLo.o: in function `main':
Das wundert mich sehr. Ich habe den Code Buchstabe für Buchstabe abgetippt und mindestens 10 mal verglichen. Auch meine Freundin hab ich alles abgleichen lassen. Kann es sein das das Buch, Auflage 2021 nicht mehr aktuell oder einfach Schmarn ist?

Ich habe öfter mal gelesen das man gets() besser nicht verwenden sollte, jedoch würde ich es nur ungern überspringen. Und sorry falls die frage bisschen einfach ist für das Forum, hab wie gesagt gerade erst angefangen das Programmieren zu lernen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8796
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gets()

Beitrag von Xin » Di Mai 03, 2022 7:06 pm

kubi hat geschrieben:
Di Mai 03, 2022 6:33 pm
Hallo, da meine Suche bei Google und Co. nichts ergeben hat, habe ich mich das erste mal in einem Forum angemeldet.
Dann hoffen wir, dass wir uns als halbwegs würdig erweisen. ;-)
kubi hat geschrieben:
Di Mai 03, 2022 6:33 pm
Falls es wichtig ist. Ich benutze Linux und compiliere direkt im Terminal.
Normalerweise nicht, aber wer unter Linux anfängt, hat offenbar schonmal ein grundlegendes Interesse am Computer.
kubi hat geschrieben:
Di Mai 03, 2022 6:33 pm
Also ich habe jetzt diesen Code abgetippt:

Code: Alles auswählen

#include <stdio.h>

int main () {
  char eingabe[100];
  printf("Geben sie einen Text mit maximal 100 Zeichen ein: ");
  gets(eingabe);
  printf("Eingegebener Text: %s", eingabe);
  return 0;
}
Beim compilieren wird das angezeigt:

Code: Alles auswählen

Warnung: Implizite Deklaration der Funktion »gets«; meinten Sie »fgets«? [-Wimplicit-function-declaration]
    8 |   gets(eingabe);
      |   ^~~~
      |   fgets
/usr/bin/ld: /tmp/ccGMhTLo.o: in function `main':
Auf den ersten Blick konnte ich auch nichts feststellen, aber ich habe es mal in onlinegdb.com reingeworfen und da zeigt noch etwas mehr:

Code: Alles auswählen

main.c:6:3: warning: ‘gets’ is deprecated [-Wdeprecated-declarations]
    6 |   gets(eingabe);
      |   ^~~~
In file included from main.c:1:
/usr/include/stdio.h:577:14: note: declared here
  577 | extern char *gets (char *__s) __wur __attribute_deprecated__;
      |              ^~~~
gets gilt als veraltet, weil gets als Funktion auch gefährlich ist.

kubi hat geschrieben:
Di Mai 03, 2022 6:33 pm
Das wundert mich sehr. Ich habe den Code Buchstabe für Buchstabe abgetippt und mindestens 10 mal verglichen. Auch meine Freundin hab ich alles abgleichen lassen. Kann es sein das das Buch, Auflage 2021 nicht mehr aktuell oder einfach Schmarn ist?
In dem Fall ist das Buch nicht mehr aktuell. Schau mal hier: gets
Da steht, dass die Funktion 2011 aus dem Standard entfernt wurde und am Ende der Seite, wie man die Funktion heute sicher benutzt.
kubi hat geschrieben:
Di Mai 03, 2022 6:33 pm
Ich habe öfter mal gelesen das man gets() besser nicht verwenden sollte, jedoch würde ich es nur ungern überspringen. Und sorry falls die frage bisschen einfach ist für das Forum, hab wie gesagt gerade erst angefangen das Programmieren zu lernen.
Das Forum ist für genau solche Fragen gedacht. Wenn Du mal 10 Jahre Programmiererfahrung hast und hier 50- bis 100-tausend Zeilen reinwirfst und fragst, wo der Fehler ist, kann sich da keiner mal eben spontan reinarbeiten. Bei 10 Zeilen geht das.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

kubi
Beiträge: 3
Registriert: Di Mai 03, 2022 6:13 pm

Re: gets()

Beitrag von kubi » Di Mai 03, 2022 7:44 pm

Danke für die schnelle Antwort. GDB online kannte ich noch nicht, merk ich mir für die Zukunft. Auf der Seite ist mir aufgefallen das der Code trotzt der komischen Meldung compiliert wird und soweit funktioniert. Hab gedacht die Warnung sei gleichbedeutend mit Fehler. Bin wohl nach der Arbeit nicht mehr so frisch im Kopf :D . Nun verstehe ich zwar immer noch nicht ganz was das mit der Warnung auf sich hat, da soweit aber alles funktioniert widme ich mich weiter dem Lernen. Vielleicht ergibt es später mal einen Sinn. Was mich viel mehr wundert ist warum in einer Auflage von 2021 gets() als gewöhnliche Funktion zur Eingabe vorgestellt wird und in keiner weise auf die Problematik dahinter eingegangen wird. Wenigstens weiß ich jetzt das ich die Finger davon lassen sollte. Danke für die Hilfe.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8796
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gets()

Beitrag von Xin » Di Mai 03, 2022 8:03 pm

kubi hat geschrieben:
Di Mai 03, 2022 7:44 pm
Hab gedacht die Warnung sei gleichbedeutend mit Fehler.
Eine Warnung solltest Du prinzipiell auch als Fehler betrachten... die kommt ja nicht grundlos. :-)
kubi hat geschrieben:
Di Mai 03, 2022 7:44 pm
Nun verstehe ich zwar immer noch nicht ganz was das mit der Warnung auf sich hat, da soweit aber alles funktioniert widme ich mich weiter dem Lernen.
Die Warnung weist Dich darauf hin, dass der Code in Zukunft falsch ist, bzw. dass Du diese Stelle ändern solltest. Die Funktion gets() sollte heutzutage nicht mehr benutzt werden.
kubi hat geschrieben:
Di Mai 03, 2022 7:44 pm
Vielleicht ergibt es später mal einen Sinn. Was mich viel mehr wundert ist warum in einer Auflage von 2021 gets() als gewöhnliche Funktion zur Eingabe vorgestellt wird und in keiner weise auf die Problematik dahinter eingegangen wird. Wenigstens weiß ich jetzt das ich die Finger davon lassen sollte. Danke für die Hilfe.
Darf ich fragen, welches Buch Du da hast?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

kubi
Beiträge: 3
Registriert: Di Mai 03, 2022 6:13 pm

Re: gets()

Beitrag von kubi » Di Mai 03, 2022 8:32 pm

Darf ich fragen, welches Buch Du da hast?
Programmieren für Einsteiger
ISBN-13: 978-3-96645-060-7

Ich habe mich da an die Breite Masse gehalten und geguckt welches Buch die meisten guten Bewertungen hat. Gibt zwar auch im Internet Seiten wo ich das lernen könnte aber ich lese einfach gerne Bücher :D .

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8796
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gets()

Beitrag von Xin » Di Mai 03, 2022 9:36 pm

kubi hat geschrieben:
Di Mai 03, 2022 8:32 pm
Darf ich fragen, welches Buch Du da hast?
Programmieren für Einsteiger
ISBN-13: 978-3-96645-060-7
Nie zuvor gesehen, das Buch - da kann ich nix zu sagen.
kubi hat geschrieben:
Di Mai 03, 2022 8:32 pm
Ich habe mich da an die Breite Masse gehalten und geguckt welches Buch die meisten guten Bewertungen hat. Gibt zwar auch im Internet Seiten wo ich das lernen könnte aber ich lese einfach gerne Bücher :D .
Ich habe Programmieren auch aus Büchern gelernt, finde aber nur noch selten welche, die mich interessieren. Allerdings waren Bücher auch damals schon teilweise ziemlich falsch. :-|

Am Ende landet man dann doch in der Community.
In dem Sinne dann: Willkommen und viel Spaß beim Lernen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten