C - dynamischer speicher und arrays
Geizhals » Forum » Programmierung » C - dynamischer speicher und arrays (39 Beiträge, 528 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
...
Re(3): C - dynamischer speicher und arrays
03.10.2008, 14:39:42
Wie erzeuge ich das Array - zu Begin weiß ich ja noch nicht wie groß das
werden soll.

Wenn ich dann weiß wieviele Elemente mein Array hat wie malloc-e ich den Platz
und bringe dem Array bei, dass es jetzt die und die Größe hat.
( In meinem Fall 4 Elemente, wieviel Platz brauche ich eigentlich für die vier
Zeiger auf meine vier  Strings? )


Ach so, du möchtest es vergrößern können. Das wird dann komplizierter, das ist in C nicht mehr so lustig.

Vielleicht findest du dafür eine fertige library, früher haben wir das immer mit Makros selbst gebastelt. Im wesentlichen gibt es unterschiedliche Ansätze:

1. faul: einfach eine ausreichende Größe vordefinieren/allokieren und hoffentlich mit assert() prüfen, ob sie auch eingehalten wird. Für kleinere, überschaubare Programme reicht das (und ist üblich).

2. sauber: Pascal-typische Arrays über typedef struct + Makros/Funktionen implementieren. Der Array wird ein neuer Datentyp, der auch die aktuelle Größe enthält und bei Bedarf (Zugriff auf Index > Größe) vergrößert wird (realloc() z.B.)

3. andere Programmiersprache verwenden, z.B. C++ (vector ...)

Bez. der Zeiger: N * sizeof(char *) beim malloc() verwenden ...



... “Spam-filters, actually. Once they became self-modifying, spam-filters and spam-bots got into a war to see which could act more human, and since their failures invoked a human judgement about whether their material were convincingly human, it was like a trillion Turing-tests from which they could learn. From there came the first machine-intelligence algorithms, and then my kind.” -- I, Row-Boat

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..........
Re(10): C - dynamischer speicher und arrays
03.10.2008, 17:43:46
Delimiters dürfen nur ein Zeichen lang sein :).
Ein bisserl was musst du auch noch machen ;).

lg Switi

-------------------------------------------------------------------

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

int explode(const char* delimiter, const char* str, char*** dest_array, int* size)
{
  int length_str = 0;
  length_str = strlen(str);

  if (strlen(delimiter) > length_str)
    {
      return 1;
    }

  int i = 0;
  int j = 0;
  int nr_tokens = 0;
  // count tokens:
  for (i=0; i<length_str; ++i)
    {
      if (str[i] == delimiter[j])
{
  ++nr_tokens;
}
    }

  //ok, now malloc token nr + 1
  char** tarr = malloc((nr_tokens + 1) * sizeof(char*));

  // copy tokens
  int start = 0;
  int end   = 0;
  int token_idx = 0;
  int token_size = 0;
  for (i=0; i    {
      if ((str[i] == delimiter[j]) || ( i+1 == length_str))
{
  end = i;
  token_size = (end - start + 1);
  tarr[token_idx] = malloc(token_size * sizeof(char));
  strncpy(tarr[token_idx], (str + start), end - start);
  tarr[token_idx][end-start] = '\0';
  printf("%d -> %s\n", token_idx, tarr[token_idx]);

  start = end + 1;
  ++token_idx;
}
    }

  *size = token_idx;
  *dest_array = tarr;
  return 0;
}

int main(int argc, char* argv[])
{

  const char* example = "foo:*:1023:1000::/home/foo:/bin/sh";

  char** dest_array = 0;
  int size = 0;

  if (explode(":", example, &dest_array, &size) == 0)
    {
      int i;
      for (i=0; i<size; ++i)
{
  printf(" %d = %s\n", i, dest_array[i]);
}
    }
  else
    {
      printf("explode call failed!\n");
    }

  return 0;
}

--
Gibts noch Leute, die die Signatur nicht blocken?
C++, Mono, C#, Java, XML, Open Source developer
Ubuntu - Linux for Human Beings

03.10.2008, 17:44 Uhr - Editiert von Switi, alte Version: hier
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung