Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Kleines C Programm » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Kleines C Programm
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
C Programmierer
unregistriert
Kleines C Programm Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Guten Morgen allerseits,

ich verstehe folgendes Programm nicht [das ich selbst programmiert habe großes Grinsen ]:

Zitat:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char z[2];
sprintf(z, "peace");
z[3]=toupper(z[3]);
printf("%s\n", z);


system("PAUSE");
return 0;
}


Es fängt bei char z[2] an. Was genau mach ich mit diesem Befehl? Nun gut, ich definiere einen string z. Doch wofür steht die 2? Ich dachte eigentlich bisher, dass die 2 für die Anzahl der Elemente, also der Buchstaben stehen würde. Aber dann fülle ich doch den string mit sprintf(z, "peace") aus, und peace besteht aus 5 Buchstaben. Dies klappt alles ohne Probleme, hä was?
27.12.2011 01:24
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallöchen,

dein Programm funktioniert nur, weil wie es scheint der Platz für ein Char-Array immer in einem größeren Abstand, bei mir 16 Byte-Weise, reserviert wird.

Ich habe hier mal ein Beispielprogramm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char z[2];  //Dein altes Array
	char y[50]; //Dieses Array wird hinter dem ersten Array angelegt
	sprintf(z, "zu viel peace macht das hirn matschig"); //mal ein längerer Text
	z[16]=toupper(z[16]);
	printf("Adresse des Anfangs von Array z: %p\n", z);
	printf("Adresse des Anfangs von Array y: %p\n", y);
	printf("Array z als String interpretiert: %s\n", z);
	printf("Array y als String interpretiert: %s\n", y);


	system("PAUSE");
	return 0;
}


Dieses Funktioniert auch noch. Man sieht aber, dass du mit in den Speicherbereich des 2. Arrays reinschreibst. Lässt du das Zweite Array weg, bekommst du einen Speicherzugriffsfehler.

C prüft nicht, ob du die Länge eines Arrays überschreitest. Das ist auch eine der Gefahren beim C-Programmieren. Je besser du dir sowas klar machst, desto weniger läufst du in irgendwelche Fallen.

Hier noch mal das Programm mit dem Speicherzugriffsfehler:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char z[2];  //Dein altes Array
	sprintf(z, "zu viel peace macht das hirn matschig"); //hier sollte dir das ganze schon um die Ohren fliegen
	z[16]=toupper(z[16]);
	printf("Adresse des Anfangs von Array z: %p\n", z);
	printf("Array z als String interpretiert: %s\n", z);


	system("PAUSE");
	return 0;
}


Ein wichtiger Hinweis noch: printf Strings sind in C mit 0 Terminiert. D.h. Die das Char-Array muss immer ein Byte länger sein als die Zeichenkette!

Hier ein Beispielprogramm:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	char z[10]; 
	sprintf(z, "peace");
	z[3]=0x00; //vorzeitige 0, hier wird der String terminiert!
	printf("Array z als String interpretiert: %s\n", z);

	system("PAUSE");
	return 0;
}


Wenn da noch Probleme beim Verständnis sind, gerne noch mal nachfragen.

Viele Grüße,

Karlito

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Karlito: 29.12.2011 00:04.

28.12.2011 20:21 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Kleines C Programm