• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

C Frage

Jesus0815

Guest
Hi,

ich steh grad total aufm Schlauch. Ist eigentlich was sehr banales...
Wie kann ich einen ganzen String ("abcdefgh" z.b.) in einem Arrayelement ablegen?

Grüße
 

ROOT

Technik/Software Forum, Casino Port Zion
Mitglied seit
17.11.2002
Beiträge
7.052
Reaktionen
38
Ort
MS
Was für ein Arrayelement?

Reines C? Dann sind Strings sowieso char-Arrays bzw. char-Pointer, hier brauchste also ein Doppelarray.

char **my_strings;
my_strings = (char**) malloc ( ANZAHL_STRINGS * sizeof(char*));
for (i = 0; i < ANZAHL_STRINGS; i++)
my_strings = (char*) malloc ( MAX_LEN * sizeof(char));

strcpy( my_strings[0], "abcdefgh" );

http://www.cplusplus.com/reference/clibrary/cstring/strcpy.html
 

Jesus0815

Guest
Jo in C. Dein Lösungsvorschlag impliziert das ich pro Element NUR EIN Zeichen speichern kann - ist das richtig?
 
Mitglied seit
08.07.2001
Beiträge
1.625
Reaktionen
0
häh?

char = ein zeichen
ein array aus chars = string
 

ROOT

Technik/Software Forum, Casino Port Zion
Mitglied seit
17.11.2002
Beiträge
7.052
Reaktionen
38
Ort
MS
Original geschrieben von TE)Kain
Jo in C. Dein Lösungsvorschlag impliziert das ich pro Element NUR EIN Zeichen speichern kann - ist das richtig?

Nein, jedes Element des Arrays my_strings kann einen String mit bis zu MAX_LEN Zeichen aufnehmen.
 

Jesus0815

Guest
Ja, aber ich wollte sowas:

string c;
c='abcdef';
Testarray[10]=c;

Meine frage war halt ob das machbar ist? dann würde an stelle [10] "abcdef" drin stehen.

Sry, sind noobfragen; aber das ist für mich studienfremd und ich muss mich hier in der Arbeit mit C und Reed Solomon rumärgern.
 

cart

Technik/Software Forum
Mitglied seit
01.08.2002
Beiträge
4.873
Reaktionen
0
Ort
New York
Immer strncpy() nehmen und nicht strcpy().
 
Mitglied seit
08.07.2001
Beiträge
1.625
Reaktionen
0
nein, da gibt es handfeste unterschiede


Difference Between Malloc and Calloc

There are two differences. First, is in the number of arguments.
Malloc() takes a single argument (memory required in bytes),
while calloc() needs two arguments (number of variables to
allocate memory, size in bytes of a single variable). Secondly,
malloc() does not initialize the memory allocated, while
calloc() initializes the allocated memory to ZERO.

Here are more opinions and answers from FAQ Farmers:

* The difference between malloc and calloc are: 1. malloc()
allocates byte of memory, whereas calloc()allocates block of
memory.

* Calloc(m, n) is essentially equivalent to p = malloc(m *
n); memset(p, 0, m * n); The zero fill is all-bits-zero, and
does not therefore guarantee useful null pointer values (see
section 5 of this list) or floating-point zero values. Free is
properly used to free the memory allocated by calloc.

* Malloc(s); returns a pointer for enough storage for an
object of s bytes. Calloc(n,s); returns a pointer for enough
contiguous storage for n objects, each of s bytes. The storage
is all initialized to zeros.

* Simply, malloc takes a single argument and allocates bytes
of memory as per the argument taken during its invocation. Where
as calloc takes two aguments, they are the number of variables
to be created and the capacity of each vaiable (i.e. the bytes
per variable).

* I think calloc can allocate and initialize memory, if the
asked memory is available contiguously where as malloc can
allocate even if the memory is not available contiguously but
available at different locations.
 
Mitglied seit
01.08.2000
Beiträge
1.782
Reaktionen
0
Ort
Hamburg
char *ptr=NULL;
ptr = "Hallo ich bin ein String!";

oder schneller

char zeich[]={"Hallo ich bin auch ein String"};
 
Mitglied seit
01.08.2000
Beiträge
1.782
Reaktionen
0
Ort
Hamburg
Mh wenn du schon 'n String hast, der in 'n anderes Array soll, dann:

char feld[10]={"ich bin10"};
char buffer[10];

strcpy(buffer,feld); /* ich hoffe so rum wars :/ */

Wenn du die 10 variabel machen willst, muss man wohl vorher mit sizeof(abcdge-feld); 'n int ausrechnen und da statt der 10 einfügen, GLAUBE ich - viel zu lange her. :D
 

cart

Technik/Software Forum
Mitglied seit
01.08.2002
Beiträge
4.873
Reaktionen
0
Ort
New York
Original geschrieben von Cleese
Wieso?
Weil man damit sonst lustige Sachen produzieren kann, z.B. Bufferoverflows und solche Scherze, wenn der Code nicht 100% gescheit ist und nachdem was hier bisher teilweise so geschrieben wurde... :)

@[UEP]Xyz: Wahrscheinlich hat er sich ein typedef geschrieben oder so. Ansonsten hast du aber Recht :P


Notiz: Ich muss echt mal wieder C programmieren ^^
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
Jo in C. Dein Lösungsvorschlag impliziert das ich pro Element NUR EIN Zeichen speichern kann - ist das richtig?

was willst du eigentlich genau machen? :-)

dein Testarray[10] = c geht nämlich im prinzip schon.
 
Mitglied seit
13.04.2002
Beiträge
747
Reaktionen
0
Ort
Braunschweig
Danke @Pizza. So genau wusste ich das nicht, dachte immer nur, das calloc schon mit 0 alles vollschreibt und bei malloc steht erstmal nix drinnen und das wars dann auch.

@Thread.
Ich glaube er möchte ein Array aus Strings erzeugen, quasi dass in array[0] = "eins"
.
.
.
array[10] =" elf" stehen kann und der Rest beliebt erweitert werden kann.

Aber dafür braucht er, wie schon von l-AG-lROOT erwähnt, ein Doppelarray.

Dabei wäre dann array[0][0] = 'e', array[0][1] = 'i', etc... und array[10][2] = 'f'.
 

Jesus0815

Guest
sehr gute lösungsvorschläge! danke, das gewährt mir auch ein besseres verständniss. muss zugeben arrays und zeiger verwirren mich noch ein wenig ^^
 
Mitglied seit
08.07.2001
Beiträge
1.625
Reaktionen
0
um dich zu verwirren:
ein array ist immer ein zeiger...
 
Mitglied seit
13.04.2002
Beiträge
747
Reaktionen
0
Ort
Braunschweig
Sorry, dass ich deinen Thread gleich mißbrauche, aber ich hätte eine kurze Frage.

Zieht man malloc calloc vor? Oder sollte man Speicher, der erst später benutzt wird mit malloc allokieren und welchen, der sofort genutzt wird mit calloc? Oder spielt das keine Rolle?
 

cart

Technik/Software Forum
Mitglied seit
01.08.2002
Beiträge
4.873
Reaktionen
0
Ort
New York
Mach dir Gedanken wieviel Speicher du brauchst und nimm malloc(). Wenn du unbedingt alles auf 0 setzen willst, dann machst du das halt mit memset() ebenfalls händisch. Erst denken und dann coden ist immer das beste, wenn man auf der Ebene rumkrebst ;)
 

The_Company

Guest
Original geschrieben von Cleese
Zieht man malloc calloc vor? Oder sollte man Speicher, der erst später benutzt wird mit malloc allokieren und welchen, der sofort genutzt wird mit calloc? Oder spielt das keine Rolle?
Nimm immer calloc, ausser Du weisst genau, was Du tust. Sonst hast Du Heisenbugs, wenn Du vergessen hast, memory auf 0 zu setzen und es ab und an mal nicht 0 ist. Wenn es ein Performance Problem ist, kann man es immernoch ueberarbeiten. Better safe than sorry.
Und es macht absolut keine Rolle, ob man Speicher sofort oder erst spaeter benutzt. Das Problem loest das Kernel, nicht Du.

Und man sollte weder strcpy noch strncopy nehmen, sondern lieber vernueftige String-Funktionen wie g_strdup_printf.
 
Oben