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); }
Das Problem sitzt hier vor der Tastatur. Wir sollen uns Deinen Code ansehen, und auch noch herausfinden, welche Probleme damit auftreten? Geht's noch?
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.
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)
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
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!
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"
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); }
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
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.
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.
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
> 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.
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.