Text?!?
-
char a='hallo';
wenn ich a ausgeben lasse, ist es immer nur der letzte buchstabe.
und wenn ich einen char einlesescanf("%c", &a);
dann ist es immer nur der erste buchstabe.
ist das immer so?
wenn ja, wie liest man einen text ein?Lg crazy
-
Hoi,
erstmal den C-String:
char a = "hallo"; printf("%s", a); /*Ausgabe von hallo*/
Mit deinem scanf, liest du immer nur ein char ein, da du aber eine Zeichenkette einlesen willst nimmst du die methoden gets() oder noch besser weil's keinen overflow zulässt: fgets().
Schau dir die mal an.Mfg
-
crazy Gast schrieb:
char a='hallo';
wenn ich a ausgeben lasse, ist es immer nur der letzte buchstabe.
und wenn ich einen char einlesescanf("%c", &a);
dann ist es immer nur der erste buchstabe.
ist das immer so?
wenn ja, wie liest man einen text ein?Lg crazy
also, ich rate sofort ein Einsteiger Buch in die Sprache C zu lesen!
1. char a='hallo'; ist total falsch, char ist ein Datentyp, das nur ein einziges Zeichen aufnehmen kann. 'hallo' ist auch falsch, weil Hallo aus 5 Zeichen und nicht aus einem Zeichen besteht.
Es soll heißen:
char a[] = "Hallo";
2. %c beim scanf liest ein Zeichen ein, nicht eine Zeichenkette. %s liest eine Zichenkette und es sollte so sein
char a[100]; /* maximal 99 Zeichen aufnehmen */ scanf("%s", a);
GPC schrieb:
Hoi,
erstmal den C-String:
char a = "hallo"; printf("%s", a); /*Ausgabe von hallo*/
auch falsch, char a = Adresse???? Wie geht denn das? Du meinst char a[] oder char a[100] oder sowas in der Art.
-
GPC schrieb:
Hoi,
erstmal den C-String:
char a = "hallo"; printf("%s", a); /*Ausgabe von hallo*/
Mit deinem scanf, liest du immer nur ein char ein, da du aber eine Zeichenkette einlesen willst nimmst du die methoden gets() oder noch besser weil's keinen overflow zulässt: fgets().
Schau dir die mal an.Mfg
mal ne zwischenfrage, was is der genau unterschied zwischen gets() und fgets(), ich habe gets des öfteren benutz und habe somit auch erfahrung mit dem overflow gemacht. kannst du mir erklären (ohne das ich jetzt in der hilfe datei rumwühlen muss) was fgets genau anders macht.
danke
-
bei fgets sagst du eben noch wie viele Zeichen er maximal einlesen soll.
gets benutzt man einfach nicht mehr. Das es überhaupt noch im C Standard ist, ist absolut verwunderlich!
-
fgets hat zwei parameter, den string in den es schreibt und eine größenangabe für den Buffer.
fgets schreibt eben nur soviel in den string rein wie der Buffer zulässt. wenn du ihm als größenangabe 15 mitgibst, dann schreibt er auch nur 15 Zeichen rein.
Bin mir aber bei der ganzen Begründerei nicht so sicher. Auf alle fälle sollte man sicherheitshalber fgets nehmen anstatt gets.EDIT:
@supertux, shit, den Fehler mit den Klammern hatte ich ganz übersehen. Na ja, danke für den Hinweis.
-
fgets ist sicherer als gets. fgets musst du mitteilen, wie viele Zeichen zu aufnehmen willst, also der Programmier kümmert sich darum, so viele Zeichen auf einmal zu lesen, wie tatsächlich gespeichert werden können. gets tut das nicht.
char x[10]; gets(x);
Wenn ich da "Hallo Welt, wie geht es dir?" eingebe, dann gibt's Buffer Overflow, weil x höchstens 9 Zeichen (ohne \0) aufnehmen kann. Dagegen
char x[10]; fgets(x,10,stdin);
Bei gleicher Eingabe wird nur "Hallo Wel" in x gespeichert aber es gibt kein Buffer Overflow.
-
kingruedi schrieb:
gets benutzt man einfach nicht mehr. Das es überhaupt noch im C Standard ist, ist absolut verwunderlich!
Ich würde da stark auf Abwärtskompatibilität tippen.
Auch die ganzen anderen "unsicheren" Stringfunktionen (strcat(), strcpy(), usw.) sind immernoch im Standard definiert.
-
TactX schrieb:
Auch die ganzen anderen "unsicheren" Stringfunktionen (strcat(), strcpy(), usw.) sind immernoch im Standard definiert.
Ich sehe diese Stringfunktionen nicht viel unsicherer an als strncat(), strncpy(), usw. Man muss genauso mitdenken beim Programmieren, wie bei den n-Funktionen.
-
AJ schrieb:
TactX schrieb:
Auch die ganzen anderen "unsicheren" Stringfunktionen (strcat(), strcpy(), usw.) sind immernoch im Standard definiert.
Ich sehe diese Stringfunktionen nicht viel unsicherer an als strncat(), strncpy(), usw. Man muss genauso mitdenken beim Programmieren, wie bei den n-Funktionen.
Deswegen habe ich auch die "" verwendet
Du hast schon recht. Denken muss man immer (am besten zweimal), aber da sehe ich eben auch den Vorteil der 'n'-Stringfunktionen. Spätestens wenn man die Länge angeben muss, ist man gezwungen nachzudenken...