Newsgroup: it.comp.lang.c
Titolo: Procedura sulle stringhe

Ho inutilmente provato a scrivere una funzione:
int strdiff(char *s, char *t, char *diff)
che prese in ingresso s, t e diff mette in diff la stringa ottenuta
togliendo a s i caratteri contenuti in t. Inoltre ritorna il numero di
caratteri della stringa s che compaioni in t. Esempio:
s = tempesta
t = acuto
strdiff(s,t,diff)=3
diff=empes
aiuto!!!!!!
Grazie

 diff=empes
#include<stdio.h>
#include<string.h>
char * diff(char *s_source,const char *s_valo)
{
  char *ptr = NULL;
  while(*s_valo){
       while ((ptr=strchr(s_source,*s_valo)))
          memmove(ptr,(ptr+1),(strlen(ptr+1)+1));
       s_valo++;
  }
  return s_source;
}
int main(int argc,char *argv[])
{
  if (argc < 3){
   fprintf(stderr,"usage: diff nome1 nome2\n");
    exit(1);
  }
  fprintf(stdout,"diff_string: %s\n",diff(argv[1],argv[2]));
  return 0;
}
--
Ivan Molella
__LINUX__ the choice of the __GNU__ generation
icq# 97960484

caratteri della stringa s che compaioni in t. Esempio:
Premesso che per routine custom si dovrebbe evitare di porre il
prefisso "str" come in "strdiff", perche' riservato alle
implementazioni standard, il mio codice e' il seguente :
#include <stdio.h>
#include <string.h>
int str_diff( const char *s, const char *t, char *diff )
{
    int i, n ;
    for ( i = 0, n = 0 ; s[i] ; i++ )
        if ( !strchr( t, s[i] ) )
           *diff++ = s[i] ;
        else
           ++n ;
    *diff = 0 ;
    return n ;
}
int main()
{
    char *s = "tempesta" ;
    char *t = "acuto" ;
    char diff[100] ;
    printf( "%d : ", str_diff( s, t, diff ) ) ;
    puts( diff ) ;
    scanf( "%*c" ) ;
    return 0 ;
}
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

    *diff = 0 ;
Io preferisco
     *diff = '\0';
a mio parere e' piu' chiaro...
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

          memmove(ptr,(ptr+1),(strlen(ptr+1)+1));
Ouch... una memmove per ogni carattere ? che scopre quanti
caratteri spostare facendo strlen ogni volta ?
Capisco non essere paranoici per l'efficienza ma secondo me
certe cose dovrebbero essere evitate... se si facesse:
  int diff(const char *src,const char *valo,char *buff)
  {
    int n=0;
    char c;
    while ((c=*src++)!='\0')
    {
      if (!strchr(c,valo))
        buff[n++]=c;
    }
    buff[n]='\0';
    return n;
  }
Si otterrebbe qualcosa di molto piu' efficiente (e secondo
me anche piu' chiaro). Se invece si dovesse lavorare con
stringhe molto grosse allora forse varrebbe la pena di usare
un approccio piu' sofisticato... immaginando char di 8 bit
una soluzione potrebbe essere...
  int diff(const char *src,const char *valo,char *buff)
  {
    static int map[256];
    int n=0;
    unsigned char c;
    /* Segna i caratteri vietati per avere un
       contollo a tempo costante */
    memset(map,0,sizeof(map));
    while (*valo)
      map[(*valo++)&255]=1;
    /* Copia i caratteri ammessi */
    while ((c=*src++)!='\0')
    {
      if (!map[c]) buff[n++]=c;
    }
    buff[n]='\0';
    return n;
  }
HTH


 Capisco non essere paranoici per l'efficienza ma secondo me.....
Se il tipo mi avesse specificato che doveva partecipare al concorso
kernel dell'anno 2000/2001 mi sarei spremuto per altri 2/3  minuti....:)


riservati. Ce ne sono altri ?
Credo sia specificato nello standard, ma adesso non ricordo dove.
Se ne parlava tempo fa su comp.lang.c.
Non so se ce ne siano altri.


Salve a tutti.
Sapete indicarmi dove trovare una funzone scritta in c che esegue la
separazione delle migliaia. 
Deve predere un char come parametro e restituire ovviamente un char.
Vi ringrazio molto, spero possiate aiutarmi.
-- 
Posted from 
IDENT:ro...@relay.aitek.it
 [194.21.160.2] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG



Ok grazie ragazzi... mi avete dato diverse soluzioni  e adesso me le studio
per bene! Devo dire che ho diverse cose da imparare... ;-) Io mio ero messo
a fare due nested for con un controllo if all'interno... diamine! ;-) Grazie
e ciao!
"Alessandro "oVeRRiDe"" <oVeRRiDe@i.i> ha scritto nel messaggio
news:Hk4%5.124113$hk4.4...@news.infostrada.it...


 ha scritto nel messaggio
news:3a3d407e...@news.interbusiness.it...


Scusami a cosa serve la funzione strchr?
RTFM :)
Scherzi a parte serve a cercare un carattere in una stringa.
Ad esempio con
  char *s="Andrea Griffini";
  char *t=strchr(s,'G');
  puts(t);
ottieni la stampa di "Griffini".
Se il carattere cercato non e' presente nella stringa
allora strchr ritorna NULL.


 wrote in message
q8n%5.4019$ag5.2...@twister1.tin.it...


 ci metti un "."
mmm... non da destra?
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it