Newsgroup: it.comp.lang.c
Titolo: Manipolazione stringhe

Salve a tutti,
come posso costruire un programma che in una stringona lunga (un 
buffer), vada a pescarmi ed a copiarmi in variabili separate tutte le 
occorrenze che stanno tra due stringhe date?
Esempio:
BUFFER: verde sole pippo mare cielo albero pianta pippo hotel carlo 
albero paperino topolino
Se volessi copiare in variabili separate le occorrenze tra pippo e 
albero come nell'esempio sotto:
token[1] = mare cielo
token[2] = hotel carlo
Conoscete un modo per fare ciò? Ho provato con strtok ma sembra gradire 
solo caratteri come delimitatori. strstr invece pesca solo "da lì in 
avanti", ma non riesco a fargli pescare "da lì indietro".
-- 
Matteo

 avanti", ma non riesco a fargli pescare "da lì indietro".
e perche' mai dovresti pescare indietro ?
con strstr puoi trovare la prima occorrenza di pippo e la prima
di albero. poi copi la roba in mezzo, poi ti sposti alla fine
dell'albero e fai di nuovo un ricerca per la prossima occorrenza di pippo
e di albero e cosi' via.
piu' che altro bisogna supporre che pippo e albero di alternino sempre
perfettamente, e che non ci siano casi ambigui tipo
a pippo b b pippo c c c albero d d albero ee pippo aa albero ee pippo.
ciao,
g.

 e di albero e cosi' via.
Ottimo! Temo però di non aver una dimestichezza con il C e soprattutto 
con la gestione stramba delle stringhe in C per fare questo. Sai dirmi 
dove trovare esempi di codice che fa qualcosa di simile?
-- 
Matteo

 e di albero e cosi' via.
Ho provato a pasticciare un pò ma i risultati non sono incoraggianti. 
Cosa sbaglio, ragazzi?
#include <stdio.h>
#include <string.h>
int main(void) {
     char ingresso[100];
     char taglio1[] = "albero";
     char taglio2[] = "yogurt";
     char tmp[100];
     char tmp2[100];
     strcpy(ingresso, "prova ciao albero pizza mare stelle yogurt sole 
chiave serratura cielo");
     printf("STRINGA INTERA: %s\n\n", ingresso);
     strcpy(tmp, strstr(ingresso, taglio1));
     strcpy(tmp, tmp+strlen(taglio1)+1);
     strncpy(tmp2, tmp, sizeof(char)*(strstr(tmp, taglio2)-tmp));
     printf("STRINGA FINALE: %s\n\n", tmp2);
return 0;
}
IN ESECUZIONE:
__________________________
STRINGA INTERA: prova ciao albero pizza mare stelle yogurt sole chiave 
serratura cielo
STRINGA FINALE: pizza mare stelle @ l@Äy@À±@8úÿ¿¿
__________________________

 __________________________
Sbagli perchè non assegni nulla a "tmp2"...
Non assegnando nulla, C assegna a tmp2 dei valori `garbage`, spazzatura
presa a caso dalla memoria.
Per provare a risolvere il problema, cambia la dichiarazione di tmp2 in:
char tmp2[100] = "";
Prova a vedere se va ;)
David
-- 
Linux Registered User #334216
Get FireFox! >> 
http://www.spreadfirefox.com/?q=affiliates&id=48183&t=1
Staff >> 
http://www.debianizzati.org
 <<

 Prova a vedere se va ;)
It works ;)
Mh... si vede così tanto che sono un javista che si sta avvicinando al C?
Ti ringrazio dell'aiuto!
-- 
Matteo

Mystic ha scritto:

E di che?
Comunque... io sono sviluppatore C# (molto simile al Java), e anch'io
all'inizio facevo di sti errori...
Non ti immaginare che sia un guru del C... a malapena riesco a fare
applicazioni console `gradevoli`... e so a malapena usare i puntatori :P
Benvenuto in niubboland!


 return 0;
Manca il terminatore '\0' alla fine della string tmp2.
assumendo che p sia un puntatore a char:
  p=strstr(tmp, taglio2);
  if (p != NULL) {
      /* se non trovi taglio2 puo' succedere di tutto visto
      ** che probabilmente andresti a leggere da -tmp!
      */
      strncpy(tmp2, tmp, sizeof(char)*(p-tmp));
      tmp2[p-tmp]='\0'; /* sizeof() non serve! */
      printf("STRINGA FINALE: %s\n\n", tmp2);
  }
  Basta ricordarsi che la stringa "pippo" in realtà è la sequenza:
  pippo\0
  non per niente le stringhe C si dicono "zero-terminated" (o 
"null-terminated")
   Remo D.

  if (p != NULL) {
if ((p != NULL) && (p >= tmp)) {