Forum: PC-Programmierung c++ probelm mit gets()


von Sebastian (Gast)


Lesenswert?

Hallo

Kannman jemand nachgucken was da nicht stimmt, irgendwie gibt das mit
dem gets() Probleme, nur welche? Irgendwie ist da der Wurm drin.

Ok, downcast, dieser size_t Typ, na ja, keine Ahnung welcher das
eigentlich ist, man könnte schon sagen das er für n Arsch ist, hat
einfach keinen Sinn.

Sebastian



# include <stdio.h>
# include <string.h>



void main()
{

  struct
  {
    char text[99];
    int count;
  } total;

  gets( total.text);

  int laenge;

  laenge= strlen(total.text);



}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Problem sitzt hier vor der Tastatur.

Wir sollen uns Deinen Code ansehen, und auch noch herausfinden, welche
Probleme damit auftreten? Geht's noch?

von Sebastian (Gast)


Lesenswert?

hängt nicht an der gets().. , hängt daran das man nach dem Struct
Zigriff( z.B. total.count =4 ;) aus nicht erfindlichen Gründen keine
Variablen anlegen kann.

hängt vielleicht am Compiler, bin etwas ennerv,sorry. Finde das ehrlich
gesagt richlich unverständlich warum man dann keine mehr anlegen kann.

von Frank E. (erdi-soft)


Lesenswert?

Was programmierst du? C? oder C++?
In C ist es, je nach Standart, nicht erlaubt, Variablen irgendwo im
Code zu deklarieren, sondern nur am Anfang.
Wenn ich mich recht entsinne, dann war es erst im C99-Standart erlaubt,
Variablen auch irgendwo im Code zu deklarieren. Ob das aber nun auf alle
Compiler zutrifft, ist fraglich.

Im übrigen ist der Code besser lesbar, wenn alle Variablendeklarationen
am Anfang jeder Funktion gemacht werden. Ebenso sieht es feiner aus,
wenn das Struct außerhalb der Funktion steht, am besten in ner Header.
(aber das nur am Rande bemerkt und auch Geschmackssache oder
Style-Guide-abhängig)

von Sebastian (Gast)


Lesenswert?

Hallo

Scheint so zu sein, war ein GCC, hatte eine C Datei. Habs danns ins
Visual Studio gehackt, CPP Datei, geht, Visual Studio C Datei, geht
nicht.

Dachte irgendwie die Gets() macht mit meinem Array was komisches, Code
ist eigentlich länger und mit Message Queue's, aber das wäre nur
verwirrender.

Natürlich ist es übersichtlicher, aber wenn man schnell mal was
probiert und dann geht es nicht grübelt man schon ordentlich. Vor allem
wenns in C++ geht und man normalerweise C++ programmiert

Muss auch sagen das in meinem C Buch nichts darüber drin steht. Die
definitionen von Variablen und structs können gemischt sein, das geht,
doch wenn ein Zugriff gemacht wurde geht nichts mehr.

Danke

Sebastian

von Karl H. (kbuchegg)


Lesenswert?

Dann sollte man noch eines sagen:
Wer gets() benutzt, sollte sofort seinen Compiler abgeben
und lebenslanges Programmierverbot erhalten. gets() ist
eine 'functiona non grata'.
Was stimmt damit nicht?
Schau dir die Argumente zu gets() an. gets() hat keine
Möglichkeit festzustellen, wie gross den eigentlich der
Buffer ist, den du da bereits stellst. Jeder Wald und
Wiesen Benutzer kann diesen Buffer überlaufen lassen.

Daher: gets() - pfui!
       fgets() - hurra!

von -daniel- (Gast)


Lesenswert?

void main{} ist tabu (ok bei mikrocontroller hätte ich es mir
verkniffen)

int main{} benutzen, weil
 -- machst dir keine Freunde
 -- sobald andere das sehen, zweifeln sie an deinen C Kenntissen
 -- *

es hat wie gesagt keine technische Gründe


ansonsten nachlesen unter
man 2 read
man fread
man fgets

oder in google eingeben "gets buffer overflow"

von BillGates (Gast)


Lesenswert?

Vielleicht so

struct
  {
    char text[99];
    int count;
  } total;


void main()
{

  total STRC;

char zeichen=gets(STRC.text);//gibt gets nicht ein Zeichen zurück?

  int laenge;

  laenge=strlen(STRC.text);

}

von Orakel (Gast)


Lesenswert?

Mr BillGates, willst Du nicht vielleicht doch lieber Koch werden?
Viele Leute haben dir nützliche Tipps gegeben,
hast du das oben durchgelesen?

Deine "nächste" Version geht so nicht durch Compiler
(handelt sich offensichtlich um c++)

struct
  {
    char text[99];
    int count;
  } total;

total ist ein Objekt, kein Typ!!!
deswegen kannst du in main kein Objekt STRC
daraus erstellen.

lies bitte nach was gets zurückgibt, wenn du nachgelesen hast
und Fragen hast, dann bitte nur zu

und das allerwichtige, versuche kurz zu umreissen
was du überhaupt erreichen willst, ehrlich gesagt
wenn ich deinen ersten Posting sehe da muss ich raten
Da geht es um Würmer im Code, kein Wort ob Program
abstürzt oder PC abraucht.

Gute nacht

von Christoph _. (chris)


Lesenswert?

Mein Tipp: Hol dir ein gutes C++-Buch. Wenn du kein Geld ausgeben
willst, schau in der nächsten (Uni-)Bibliothek, die haben bestimmt
etwas in der Richtung.

Alles andere ist IMHO ziemlich sinnfrei, denn Programmieren ist nunmal
kein "solang rumprobieren bis der Compiler es schluckt".
Zum Beispiel solltest du dir im allerersten Schritt völlig klar darüber
werden, ob du C oder C++ programmieren möchtest. Ein Mischmasch ist
keine Alternative.

Wenn du C++ programmieren willst, schmeiß deinen ganzen bisherigen Code
weg, das ist kein C++. In C++ würde man, um nur ein Beispiel zu nennen,
kein char*-String oder gar gets() oder strlen() nehmen, sondern ganz
einfach std::string aus dem Header <string> (nicht <string.h>).
Außerdem sind in C++ die Header <stdio.h> und <string.h> veraltet und
zeugen nur davon, dass du versuchst, C in C++ zu programmieren.

von BillGates (Gast)


Lesenswert?

Zitat Orakel
"
Mr BillGates, willst Du nicht vielleicht doch lieber Koch werden?
Viele Leute haben dir nützliche Tipps gegeben,
hast du das oben durchgelesen?

Deine "nächste" Version geht so nicht durch Compiler
(handelt sich offensichtlich um c++)

struct
  {
    char text[99];
    int count;
  } total;

total ist ein Objekt, kein Typ!!!
deswegen kannst du in main kein Objekt STRC
daraus erstellen.
"





Ok gets habe ich wohl mit getc verwechselt aber
wieso ist total ist ein Objekt  ?
Von was bitte soll Total ein Objekt sein?
Das ist schlicht und ergreifend ein  Typ.

legt dich wieder schlafen!!!



Übrigens Diskussionen über veraltet oder nicht ist völlig wurscht  wer
Laufzeitrelevante Anwendungen schreibt, landet fast immer beim alten.
Es gibt nur einen Ansi-Standart alles andere programmiert man so wie
man will und wie es der Compiler braucht.

von Michael (Gast)


Lesenswert?

Hallo BillGates,
kein Wunder das Windows so Probleme hat bei deinen
Prgrammierkenntnissen.

Auszug aus Handbuch:
   struct [tag] { member-list } [declarators];

daraus folgt:
   struct { char text[99]; int count; } total;
   total ist eine Variable einer anonymen Struktur!

   struct total { char text[99]; int count; };
   total ist ein Typ.

Gruß
Michael

von Rolf Magnus (Gast)


Lesenswert?

> In C ist es, je nach Standart, nicht erlaubt, Variablen irgendwo
> im Code zu deklarieren, sondern nur am Anfang.

Welche Art zu stehen man hat, ist eigentlich egal.
SCNR

> Wenn ich mich recht entsinne, dann war es erst im C99-Standart
> erlaubt, Variablen auch irgendwo im Code zu deklarieren.

C99 ist die einzige gültige C-Norm. Mit ihrer Einführung wurde C90 für
ungültig erklärt.

> Im übrigen ist der Code besser lesbar, wenn alle
> Variablendeklarationen am Anfang jeder Funktion gemacht werden.

Das ist Ansichtssache. Ich finde es besser, wenn Variablen den
kürzestmöglichen Scope haben, also erst da definiert werden, wo sie
auch zum ersten Mal benutzt werden. Da muß ich nicht bei der ersten
Benutzung erstmal wieder nach oben schauen, wie die noch gleich
definiert war. Außerdem hat es auch den Vorteil, daß man sie meistens
gleich mit einem sinnvollen Wert initialisieren kann, statt sie
uninitialisiert zu lassen oder mit irgendeinem unnützen Dummy-Wert
vorzubelegen.

von Björn (Gast)


Lesenswert?

"Das ist Ansichtssache. Ich finde es besser, wenn Variablen den
kürzestmöglichen Scope haben, also erst da definiert werden, wo sie
auch zum ersten Mal benutzt werden. Da muß ich nicht bei der ersten
Benutzung erstmal wieder nach oben schauen, wie die noch gleich
definiert war. Außerdem hat es auch den Vorteil, daß man sie meistens
gleich mit einem sinnvollen Wert initialisieren kann, statt sie
uninitialisiert zu lassen oder mit irgendeinem unnützen Dummy-Wert
vorzubelegen."

genau! Das war ja auch der Sinn dieser "Erweiterung"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.