Char-funktion In C
#1
geschrieben 22. Oktober 2008 - 21:44
bin noch Anfänger in der C-Programmierung und hätte da mal eine Frage. Hatten da in der FH so ein kleines Programm (Ausschnitt):
char text1[5];
printf ("Bitte geben Sie die eine Zeichenfolge ein\n");
printf("EINGABE: ");
scanf("%s",text1);
printf("AUSGABE: %s\n",text1);
Kann mir jemand von euch sagen was genau die [5] in den Klammern hinter text1 oben bedeutet? glaube ja das dann für die Zeichenfolge ein Speicherplatz von 5 Byte reserviert wird... nur wie kann man das denn genau erklären?
Danke
MfG
Anzeige
#2 _MagicAndre1981_
geschrieben 22. Oktober 2008 - 21:53
#3
geschrieben 22. Oktober 2008 - 21:56
Der Code ist auch absolut inakzeptabel, wenn ihr sowas in der FH lernt, dann beschwer dich mal bitte. Wenn du mehr als 4 Zeichen eingibst, überschreibst du den Puffer, das darf nie passieren...
#4
geschrieben 22. Oktober 2008 - 22:09
edit:
d.h. dann das für jedes Zeichen ein Byte verwendet wird?
Dieser Beitrag wurde von Triale bearbeitet: 22. Oktober 2008 - 22:10
#6
geschrieben 23. Oktober 2008 - 13:09
char text1[5] erstellt 5 Variablen im Arbeitsspeicher auch welche du über einen Index zugreifen kannst.
In deinem Fall existieren nun die Variablen:
text1 [0];
text1 [1];
text1 [2];
text1 [3];
text1 [4];
Bei Null wird angefangen zu zählen. Wenn du nun abc eingibst steht in den Variablen folgendes:
text1 [0] --> a
text1 [1] --> b
text1 [2] --> c
text1 [3] --> '\0' --> Binäre Null, mit dieser wird ein char Feld/array beendet, die wird automatisch mit dem Druck auf die Taste Enter in die Variable geschrieben. So ist das zumindest in C++.
text1 [4] --> irgend ein Mist, hat dich nicht zu interessieren
Hoffe ich habe alles richtig wiedergegeben.
Kleiner Tipp von mir: Kauf dir ein gutes C Buch und les dir einfach die Sachen aus der Schule einfach mal durch. Das ist ja nicht schwer wenn du schon alles gehört/verstanden hast aber du lernst immer noch Tipps und Tricks wie du etwas besser, etc. machen kannst.
Gruß smite
#7
geschrieben 23. Oktober 2008 - 15:26
#8
geschrieben 23. Oktober 2008 - 16:00
Zitat (Triale: 23.10.2008, 16:26)
Ohne Garantie auf Richtigkeit, kenne mich selbst damit nicht so genau aus und wir programmieren in der Schule mit c++, aber das ist im Prinzip egal.
Ich habe ein Programm geschrieben:
#include <iostream> using namespace std; int main(int argc, char* argv[]) { char text1 [5]; cout<<"Eingabe:\t"; cin>>text1; cout<<"text1 [0] --> "<<text1 [0]<<endl; cout<<"text1 [1] --> "<<text1 [1]<<endl; cout<<"text1 [2] --> "<<text1 [2]<<endl; cout<<"text1 [3] --> "<<text1 [3]<<endl; cout<<"text1 [4] --> "<<text1 [4]<<endl; return 0; }
In dieses Programm gebe ich die Buchstaben abc ein. text01 [0] bis text1 [2] enthalten die Buchstaben abc. Variable text1[3] enthält eine binäre Null, welche nicht angezeigt wird. In der letzten Variable steht irgend ein Mist, welcher sich noch im Arbeitsspeicher steht.
Es funktioniert so auch, da die Werte trotzdem eingegeben werden und an nachfolgende stellen im Speicher geschrieben werden. Durch den Index wird dann einfach um weitere 8 Bit im Speicher weitergesprungen. Die 8 Bit werden durch den Datentyp bei der Deklaration festgelegt.
Aber so ist das ein Fehler in deinem Programm, da die Daten ab dem fünften Feld (text1 [4] durch andere Programme überschrieben werden können.
Eine häufige Fehlerquelle sind falsche Bedingung, durch die über das Ende eines Arrays hinausgeschrieben wird. Dadurch kann ein Programm auch einfach abstürzen. Also ein Array lieber zu groß machen, als zu klein.
Viele Grüße smite
#9
geschrieben 23. Oktober 2008 - 16:01
Deshalb schreibst du in unbekannten Speicherbereich, was gefährlich ist. Da kann dann z.B. dein Programmcode überschrieben werden (so funktionieren auch Buffer Overflow-Sicherheitslücken, die z.B. vom Blaster-Virus verwendet wurde), andere Variablen überschrieben werden, oder auch das Programm selbst abstürzen (wenn der Speicher danach nicht mehr zur eigenen EXE gehört). Deshalb muss sowas verhindert werden.
#10
geschrieben 23. Oktober 2008 - 21:05
nochmal zur wiederholung: d.h. also ich kann bei [5] maximal 4 Zeichen eingeben, der letzte ist für die binäre 0
Dieser Beitrag wurde von Triale bearbeitet: 23. Oktober 2008 - 21:13
#11
geschrieben 23. Oktober 2008 - 21:38
Zitat (Triale: 23.10.2008, 22:05)
nochmal zur wiederholung: d.h. also ich kann bei [5] maximal 4 Zeichen eingeben, der letzte ist für die binäre 0
Richtig.
Also nehm lieber zu viele Felder, als zu wenige.
Wenn du z. B. überprüfen willst wie viele Zeichen der Anwender eingegeben hat. Das Zeichen der Binären null ist glaube ich '\0'.
for (int i=0; text1 [i] !='\0'; i++)
{
}
cout<<"Es wurden "<<i<<" Zeichen eingegeben"<<endl;
Gruß smite
Edit: Achtung, ein array mit 5 Feldern hat den Index 0-4.
Ein array mit 20 Feldern hat den Index 0-19.
Es wird bei Null angefangen zu zählen.
Wenn du noch Fragen hast, poste einfach
Dieser Beitrag wurde von smite bearbeitet: 23. Oktober 2008 - 21:42
#12 _Slevin_
geschrieben 29. Oktober 2008 - 22:42
Dieser Beitrag wurde von Slevin bearbeitet: 15. Januar 2010 - 18:12
#13 _MagicAndre1981_
geschrieben 29. Oktober 2008 - 22:48
#14
geschrieben 30. Oktober 2008 - 19:56
Run-Time Check Failure #2 - Stack around the variable 'auswahl' was corrupted.
char auswahl[5]
wenn ich char auswahl allerdings ohne klammer verwende, dh ohne zuweisung passiert das gleiche. erst wenn ich das %s durch ein %c ersetze, kommt kein fehler mehr, allerdings darf ja vor dem zeichen weder ein leerzeichen noch ein return sein.
EDIT:
printf ("Bitte geben Sie zwei ganze Zahlen, zwei Kommazahlen und ein Zeichen ein: \n");
printf ("1. Zahl: ");
scanf ("%i", &zahl1);
printf ("2. Zahl: ");
scanf ("%i", &zahl2);
printf ("3. Zahl: ");
scanf ("%lf", &zahl3);
printf ("4. Zahl: ");
scanf ("%lf", &zahl4);
printf ("Zeichen: ");
getchar();
scanf ("%c", &auswahl);
Durch Einfügen des getchar(); (und verwenden von %c) wartet er auf meine Eingabe des Zeichens. Verstehe ich das richtig das er ohne dieses getchar das letzte Return von zahl4 aus dem speicher nimmt und dies als zeichen einsetzt, durch das getchar allerdings lässt er mich etwas eingeben und wartet auf das nächste return? kann man sowas auch anders lösen?
Dieser Beitrag wurde von Triale bearbeitet: 30. Oktober 2008 - 20:46