Lösung der Aufgabe 11-5:

Schreibe eine Funktion mit dem Prototyp
void makeliste (int liste[], int *n, char *s);

welche durch Beistrich getrennte Zahlen in einem Vektor abspeichert.
s ...... Zeiger auf die Zeichenkette mit den Zahlen
pn .... Zeiger auf Anzahl der Zahlen
liste ..Container für die Zahlen (Vektor)

Beispiel: "2,3,8,12,27,98"

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

void makeliste1(int liste[], int *n, char *s);
void makeliste2(int liste[], int *n, char *s);

int main(void)
{
  int z[20];
  int i, n;
  char ts[50];

  printf("Teststring ? ");
  gets(ts);

  makeliste2(z, &n, ts);
  printf("Resultat der Funktion makeliste2 (Eigenbau):\n");
  for (i = 0; i < n; i++)
    printf("%i  ", z[i]);

  makeliste1(z, &n, ts);
  printf("\nResultat der Funktion makeliste1 (strtol):\n");
  for (i = 0; i < n; i++)
    printf("%i  ", z[i]);

  printf("\n\n");

  return 0;
}


/* Beide Loesungen ueberpruefen nicht, ob nur der Beistrich als
   Trennzeichen vorkommt, jedes Zeichen, das kein Zwischenraumzeichen
   oder keine Ziffer ist, wirkt als Trennzeichen, dies entspricht der
   Arbeitsweise von strtol */

/* makeliste1: Loesung mit der Bibliotheksfunktion strtol */

void makeliste1(int liste[], int *n, char *s)
{
  char *p, *pnext;
  int i;

  p = s;
  i = 0;
  do {
    liste[i++] = (int) strtol(p, &p, 10);
  }
  while (*p++ != '\0');

  *n = i;

}


/* makeliste2: Eigenbau */

void makeliste2(int liste[], int *n, char *s)
{
  char *p;
  int i;

  p = s;
  i = 0;
  liste[i] = 0;
  while (*p != '\0') {
    if (isdigit(*p))
      liste[i] = 10*liste[i] + *p - '0';
    else if (liste[i] == ' ')
      ;
    else {
      i++;
      liste[i] = 0;
    }
    p++;
  }
  *n = i+1;
}