PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Arrays



Pekel
22.10.2008, 19:12
Hallo,

ich habe hier eine (wahrscheinlich) lächerliche Frage:

Was sind Arrays und wofür benutzt man sie?

Was ich bissher weiß ist, dass sie "Felder" sind:

int Feld [19]
Datentyp Name [Größe?]

Ich bedanke mich jetzt schonmal für alle antworten :)

RikuXan
22.10.2008, 19:40
Arrays aka Felder sind sozusagen Ansammlungen von Variablen.
zB ist

int Feld1[20];
ein Array, der aus 20 Integerwerten besteht, die alle einzeln über ihren Index ( das in den [] ) angesprochen werden können.
Wie Arrays, denke ich am meisten benutzt werden, sind Arrays of char.
Ein Array of char ist, wie der Name schon sagt eine Ansammlung von einzelnen Charvariablen. Das ist sehr praktisch, da man so ganze Sätze, Wörter und Ähnliches ausgeben kann.
Allerdings muss man beachten, dass in einen Array of char immer ein Zeichen weniger reinpasst, als im Index der Deklaration steht. So passen zB in

char Text[20];
nur 19 Zeichen, obwohl der Array 20 Variablen groß ist. Das liegt daran, dass der letzte Platz, für den "Null-Terminator" benutzt wird ( wenn der String 19 Zeichen lang ist, ansonsten ist er halt das Zeichen nach dem letzten normalen Zeichen ), der dem PC sagt wann der String abgeschlossen ist. Das >Muss< immer bedacht werden, da sonst ernsthafte Programmabstürze und Exploits hervorgerufen werden können.
Sonstiges:
Initialisierung von Arrays: int Feld1[5] = { 12 , 23 , 43 , 1 , 2 };

MfG RikuXan

Falls mir noch was einfällt trag ichs nach, wollte nich so viel schreiben

blackberry
22.10.2008, 19:57
nur 19 Zeichen, obwohl der Array 20 Variablen groß ist. Das liegt daran, dass der letzte Platz, für den "Null-Terminator" benutzt wird ( wenn der String 19 Zeichen lang ist, ansonsten ist er halt das Zeichen nach dem letzten normalen Zeichen ), der dem PC sagt wann der String abgeschlossen ist. Das >Muss< immer bedacht werden, da sonst ernsthafte Programmabstürze und Exploits hervorgerufen werden können.

Das >muss< nicht sein.
Zeichenketten, die in Anführungszeichen stehen wird zwar immer ein NULLbyte angehängt wodurch eine Zuweisung eines 20 Zeichenstring auf einen char-Array nicht (direkt) möglich ist (-> Fehlermeldung vom Compiler).

Trotzdem ist diese NULLterminierung keines wegs ein muss und wurde lediglich in der Standartbibliothek so eingeführt - eine Zeichenketten-terminierung kann durch JEDES beliebige Zeichen erfolgen, solange man es in seinen Funktionen als ein solches erkennt.

Sagen wir mal ich möchte meine char-Arrays mit dem ASCII-Zeichen 1 terminieren...

Quelltext:

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


int strlen2(char *array)
{
int x;
for(x = 0; array[x] != 1; x++);
return x;
}

int main(void)
{
char array[20];
memcpy(array, "1234567890123456789\1", 20);
printf("Stringlänge (ANSI): %d\n", strlen(array));
printf("Stringlänge (BLACKBERRY XD): %d\n", strlen2(array));
return 0;
}

Ausgabe:

blackberry@system:~/Desktop$ gcc a.c -o a; ./a
Stringlänge (ANSI): 20
Stringlänge (BLACKBERRY XD): 19


Und so kann man dann weiter arbeiten :)

RikuXan
22.10.2008, 20:04
Dann sag ichs so:
Wenn du gemütlich mit den Standardbibliotheksfunktionen arbeiten willst, wovon ich ausgegangen bin ;)

MfG RikuXan

Sector
22.10.2008, 20:07
Ich will ja nichts sagen, aber ich würde dir empfehlen, ein C bzw Cpp Buch zu kaufen, glaube mir, dass bringt dir ne Menge ;)
Weil in sagen wir mal 95% aller Bücher für Einsteiger steht drin, was ein Array ist, und wie man sie benutzt etc.

Pekel
22.10.2008, 20:33
Ich will ja nichts sagen, aber ich würde dir empfehlen, ein C bzw Cpp Buch zu kaufen, glaube mir, dass bringt dir ne Menge ;)
Weil in sagen wir mal 95% aller Bücher für Einsteiger steht drin, was ein Array ist, und wie man sie benutzt etc.

Ich habe auch eins (Das C/C++ Kompendium von Dirk Louis), allerdings konnte ich in dem Kapitel von den Arrays nicht das wichtigste "Rausfiltern", weil dort steht auch ziemlich viel an "Hintergrundwisse" etc. drinne. Fand die erklärung von RikuXan für mich etwas leichter zu verstehen.

Dennoch halte ich es für ein Top-Buch, auch wenn ich noch nicht außergewöhnlich weit vorrangekommen bin..

btw:
Denke ich habe durch die Erklärung von RikuXan (erst einmal) alles
wichtige über Arrays gelernt.

@BlackBerry: Ist es denn ein so großer Unterschied, wenn ich das Feld nun um eine Stelle kleiner lasse? Glaube es wird keinen stören, wenn ich standartmäßig immer das Feld um 1 größer habe, als ich Variablen habe.

blackberry
22.10.2008, 21:28
Ich habe auch eins (Das C/C++ Kompendium von Dirk Louis), allerdings konnte ich in dem Kapitel von den Arrays nicht das wichtigste "Rausfiltern", weil dort steht auch ziemlich viel an "Hintergrundwisse" etc. drinne. Fand die erklärung von RikuXan für mich etwas leichter zu verstehen.

Gerade darum ist C++ gut und andere Sprachen (zB. VB) Müll
- in C/C++ musst du dich wenigstens mal mit Speicher & Co. beschäftigen!



@BlackBerry: Ist es denn ein so großer Unterschied, wenn ich das Feld nun um eine Stelle kleiner lasse? Glaube es wird keinen stören, wenn ich standartmäßig immer das Feld um 1 größer habe, als ich Variablen habe.

Wenn du wegen einem Byte mehr oder weniger einen Buffer-Overflow drin hast ist das sehr wohl ein Unterschied.
Mal ganz davon abgesehen hat RikuXan eigentlich vollkommen recht mit der NULL-terminierung - ich wollte nur nochmal zeigen, dass es (zumindest theoretisch) auch anders geht.

Also lies dir das Kapitel am besten nochmal durch (ich habs auch mehr als einmal gelesen ^^) und versuch dich dann vielleicht mal daran ein paar Methoden der "string"-Klasse (#include <string>) als Funktionen zu implementieren - ist eine sehr schöne Übung und wenn du C-kompatibel programmieren willst sicher auch sehr hilfreich, weil die string-Klasse in C nicht existiert...


mfG. BlackBerry

Pekel
22.10.2008, 22:05
Wenn ich mir deinen Text noch einmal durchlese, denke ich auch, dass ich noch einmal einige Kaptiel lesen sollte...

String? In vb waren das wörter :P

krusty
22.10.2008, 22:06
ich habe eine frage, passen in ein array char blub [6]
nicht doch genau 6 variablen?


blub [0] = 1;
blub [1] = 2;
blub [2] = 3;
blub [3] = 4;
blub [4] = 5;
blub [5] = 6;

? oda liege ich da total falsch ? :(

blackberry
22.10.2008, 22:26
ich habe eine frage, passen in ein array char blub [6]
nicht doch genau 6 variablen?

Ja, das ist richtig.
Nur wie RikuXan schon erwähnt hat kann es sein, dass Funktionen wie strlen aus der Standartbibliothek dann keine Korrekten Ergebnisse mehr zurückgeben.
Also sofern du diese Funktionen benutzen willst reserviere immer ein Zeichen mehr als du tatsächlich brauchst.

-[RiDER]-
23.10.2008, 12:59
Hi :D

Trotzdem ist diese NULLterminierung keines wegs ein muss und wurde lediglich in der Standartbibliothek so eingeführt
Die Standardbibliothek ist Teil der Sprachdefinition und die definiert einen String (immer gerne als "C-Strings" bezeichnet) eindeutig:

A string is a contiguous sequence of characters terminated by and including the first null character.

Also nur um den Neuling nicht zu verwirren: Strings "as is" sind nullterminiert. :)

Doch man muss nicht mal zwingend einen String terminieren! (Verdammt! Jetzt widerspreche ich mir schon wieder... verdammte Schizophrenie!)
Wenn Du die Länge eines Strings sicher weißt, kannst Du auch damit arbeiten.

Beispiel recv().
Die Funktion empfängt eine Nachricht von einem Socket und packt sie in einen Vektor (z.B. in der Netzwerkprogrammierung ist diese Funktion unumgänglich). Der Rückgabewert der Funktion ist die Anzahl der gelesenen Bytes (also normalerweise die Länge der empfangenen Nachricht).
Der empfangene String ist nicht nullterminiert (also kein "C-String" ;) ), aber Du kennst seine Länge. Mir fällt ad hoc keine Stringfunktion der Standardlibrary ein, die (selbst, oder ein analoges Pendant) nicht die Möglichkeit bietet, die Länge eines erwarteten Strings festzulegen.

Eine kleine Spezialfunktion gibt es, die sich hartnäckig gegen den Standard richtet. Die Rede ist von strncpy() :? . Die Funktion ist Teil der Standard-Stringfunktionen, in einem bestimmten Spezialfall arbeitet sie aber nicht mit C-Strings (nämlich wenn src größer oder gleich len ist). Aber damit sollte man fertig werden können. :D

Was ich eigentlich sagen wollte (um zum Topic zurückzukehren :D ) ist, dass man nicht immer zwingend ein Byte mehr reservieren muss, als der "String" (insofern man ihn dann noch als solchen bezeichnen darf) maximal sein darf. Und zwar genau dann nicht, wenn man die Länge des Strings genau kennt (nicht die breite des deklarierten Vektors, sondern die Länge des Strings, der in ihm steckt!!!) und nur mit Befehlen arbeitet, die keine Nullterminierung erwarten.

GreetZ RiDER :D :D :D