WinFuture-Forum.de: Char-funktion In C - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Char-funktion In C


#1 Mitglied ist offline   Triale 

  • Gruppe: aktive Mitglieder
  • Beiträge: 132
  • Beigetreten: 13. September 05
  • Reputation: 0

geschrieben 22. Oktober 2008 - 21:44

Tag Leute,

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
0

Anzeige



#2 _MagicAndre1981_

  • Gruppe: Gäste

geschrieben 22. Oktober 2008 - 21:53

Strings gibt es in C direkt als Typ nicht, dort ist ein String ein Array von chars. Dein String ist also ein Arry von chars mit der du 5 Zeichen speichern kannst.
0

#3 Mitglied ist offline   Lofote 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.526
  • Beigetreten: 24. August 04
  • Reputation: 1

geschrieben 22. Oktober 2008 - 21:56

Nur 4 Zeichen, eines wird als Stringende (Null-Byte) gebraucht.
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...
0

#4 Mitglied ist offline   Triale 

  • Gruppe: aktive Mitglieder
  • Beiträge: 132
  • Beigetreten: 13. September 05
  • Reputation: 0

geschrieben 22. Oktober 2008 - 22:09

aber wenn ich jetzt wahllos meinetwegen 20 zeichen eingebe wird alles akzeptiert...

edit:

d.h. dann das für jedes Zeichen ein Byte verwendet wird?

Dieser Beitrag wurde von Triale bearbeitet: 22. Oktober 2008 - 22:10

0

#5 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 23. Oktober 2008 - 11:59

jap jedes zeichen benötigt 1 byte
0

#6 Mitglied ist offline   smite 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.199
  • Beigetreten: 08. Januar 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:127.0.0.1

geschrieben 23. Oktober 2008 - 13:09

Du kannst dir das so vorstellen.
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
Eingefügtes BildEingefügtes Bild
0

#7 Mitglied ist offline   Triale 

  • Gruppe: aktive Mitglieder
  • Beiträge: 132
  • Beigetreten: 13. September 05
  • Reputation: 0

geschrieben 23. Oktober 2008 - 15:26

ok danke =).. nur wieso kann ich dann trotz der [5] mehr als 4 zeichen eingeben?
0

#8 Mitglied ist offline   smite 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.199
  • Beigetreten: 08. Januar 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:127.0.0.1

geschrieben 23. Oktober 2008 - 16:00

Beitrag anzeigenZitat (Triale: 23.10.2008, 16:26)

ok danke =).. nur wieso kann ich dann trotz der [5] mehr als 4 zeichen eingeben?

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

Angehängte Miniaturbilder

  • Angehängtes Bild: char_array.JPG

Eingefügtes BildEingefügtes Bild
0

#9 Mitglied ist offline   Lofote 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.526
  • Beigetreten: 24. August 04
  • Reputation: 1

geschrieben 23. Oktober 2008 - 16:01

Weil scanf es nicht nachprüft, wieviel Puffer zur Verfügung steht (kann er auch nicht wirklich, da mit Zeigern gearbeitet wird).
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.
0

#10 Mitglied ist offline   Triale 

  • Gruppe: aktive Mitglieder
  • Beiträge: 132
  • Beigetreten: 13. September 05
  • Reputation: 0

geschrieben 23. Oktober 2008 - 21:05

ah ok danke für die super erklärung an euch =)

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

0

#11 Mitglied ist offline   smite 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.199
  • Beigetreten: 08. Januar 07
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:127.0.0.1

geschrieben 23. Oktober 2008 - 21:38

Beitrag anzeigenZitat (Triale: 23.10.2008, 22:05)

ah ok danke für die super erklärung an euch =)

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 :wink:

Dieser Beitrag wurde von smite bearbeitet: 23. Oktober 2008 - 21:42

Eingefügtes BildEingefügtes Bild
0

#12 _Slevin_

  • Gruppe: Gäste

geschrieben 29. Oktober 2008 - 22:42

gelöscht

Dieser Beitrag wurde von Slevin bearbeitet: 15. Januar 2010 - 18:12

0

#13 _MagicAndre1981_

  • Gruppe: Gäste

geschrieben 29. Oktober 2008 - 22:48

klar sollte man die sicheren Methoden in Kombination mit dem GS switch nutzen, aber hier gehts um das Lernen der Sprache C und nicht um sicheren Code zu schreiben.
0

#14 Mitglied ist offline   Triale 

  • Gruppe: aktive Mitglieder
  • Beiträge: 132
  • Beigetreten: 13. September 05
  • Reputation: 0

geschrieben 30. Oktober 2008 - 19:56

da kam dann direkt schon das nächste problem.. (Es soll 1 Zeichen eingelesen werden) wenn ich zb eine variable oben definiere und den Speicherplatz in klammer dazu schreibe, weiter unten dann die "funktion" %s zum einlesen verwende, meldet er am programmende ein fehler:
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

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0