Newsgroup: it.comp.lang.c
Titolo: split ... perchè non funza?

ciao,
non so se esiste una funzione che mi permetta di splittare una stringa in
più sottostringhe (Split in VB) così ho pensato di abbozzarne una, ma quando
provo a stampare il risultato mi tira fuori tutti NULL.
Qualcuno può helparmi?
----------------
#include <stdio.h>
#include <string.h>
char *sBuff[10];
void split(char *);
int main(void)
{
    char *str;
 str = "pp|2|pippo|3";
 split(str);
 printf("\n%s", sBuff[0]);
 printf("\n%s", sBuff[1]);
 printf("\n%s", sBuff[2]);
 printf("\n%s", sBuff[3]);
 return 0;
}
void split(char *str)
{
 int idx = 0;
 int i;
 int x = 0;
 for (i=0; i < strlen(str); i++){
  if (str[i] != '|'){
   sBuff[idx][x++] = str[i];
  }
  else{
   idx++;
   x = 0;
  }
 }
}

 tutti NULL.
C'erano un paio di errori concettuali, mi sono permesso di correggerti
il programma.
#include <stdio.h>
#include <string.h>
/* qui prevedi 10 puntatori a stringa...*/
char *sBuff[10];
void split(char *);
int main(void)
{
  char *str;
  int i=0;
  /* ... ma esageriamo! */
  str = "|pp|2|pippo|3|aa|||cc|ddd|e|fff|gg|hhh||i";
  /* stampiamo anche l'indirizzo, va'! */
  printf("\n%08x %s", str, str);
  printf("\n");
  split(str);
  while(sBuff[i])
  {
    printf("\n%08x %s", sBuff[i], sBuff[i]);
    i++;
  }
  return 0;
}
void split(char *str)
{
  int i;
  int x = 0;
  int strl=strlen(str);
  /*
  strlen verrebbe rievalutata ad ogni ciclo
  mettendo i terminatori finisce al primo | che trova
  */
  for (i=0; i < strl; i++)
  {
    if (str[i] != '|')
    {
      /*
      assegnavi il carattere str[i] ad un sBuff di 2 dimensioni,
      che hai dichiarato tra l'altro come array di 10 ptr a char
      */
      sBuff[x++] = str+i; /* o se preferisci, &(str[i]); */
      /* saltiamo fino al prossimo | */
      while(str[i] && str[i] != '|')
        i++;
    }
    /* se vuoi gestire le stringhe vuote, de-commenta l'else*/
    /*
    else
      sBuff[x++] = str+i;
    */
    /* i '|' vanno sostituiti con il terminatore di stringa */
    str[i] = '\0';
    /* se le sottostringhe sono piu' di quelle previste esci */
    if(x >= sizeof(sBuff)/sizeof(sBuff[0]))
      break;
  }
}
/**********************************************************************
Alternativa con puntatore al posto dell'indice a stringa
void split(char *str)
{
  char *p;
  int x=0;
  p=str;
  while(*p)
  {
    if (*p != '|')
    {
      sBuff[x++] = p;
      while(*p && *p != '|')
        p++;
    }
    /*
    else
      sBuff[x++] = p;
    */
    *p++ = '\0';
    if(x >= sizeof(sBuff)/sizeof(sBuff[0]))
      break;
  }
}
**********************************************************************/
-- 
iAN CooG - ANTIFAN #1 di Simone Crisari
Judgement day the second coming arrives
Before you see the light, you must die!
(South of heaven) (Slayer Gig count: 5)

   char *str;
mi autocorreggo:
char str[]="|pp|2|pippo|3|aa|||cc|ddd|e|fff|gg|hhh||i";
che non si sa mai... ho il dubbio che (sotto NT specialmente) modificare
una stringa dichiarata char* rompa un po' ^^;
/me va a rileggere K&R 5.5


ciao iAN,
grazie 1000, vedo dall'ora che anche Tu hai dormito poco stanotte! ;)
Grazie ancora, questa funzione mi serviva proprio, farò comunque delle prove
anche con strtok()
grazie ancora
"iAN CooG" <201...@libero.it.no.spam> ha scritto nel messaggio
news:uxE59.57215$n04.1...@twister2.libero.it...


anche con strtok()
strtok non è il massimo come funzione. Prova a cercare con Google nei
post abbastanza recenti strtok su questo gruppo.
-- 
Marco Barisione (ICQ 84277092)

 /me va a rileggere K&R 5.5
Lo standard dice che se dichiari una stringa in questo modo
char *stringa = "stringa"
non e' detto che sia modificabile (in pratica sara' costante). Per quella 
che e' la mia esperienza e' molto probabile che si verifichi questa 
situazione.
Questo e' uno dei principali errori che si verificano in fase di testing 
delle funzioni che operano su stringhe :P
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."