mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);



}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Erdrich (erdi-soft)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: -daniel- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: BillGates (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

}

Autor: Orakel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: BillGates (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Björn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.