Newsgroup: it.comp.lang.c
Titolo: Stringhe e C... gioie e DOLORI...

Ho un problemino... ho da pochissimo iniziato a studiare il C e mi sono
imbattuto nella complicata gestione delle stringhe di testo... ho provato a
fare un programma che, definita, almeno per ora, una stringa ricercasse
all'interno di essa un testo e lo sostituisse con un altro (l'idea è quella
di fare un prog. che dati gli accordi di una canzone possa aumentare o
diminuirne la tonalità)... purtroppo a un certo punto mi sono imbattuto in
errori di sistema nel kernel di W98 o nel file eseguibile (a seconda della
dimensione di un array)... allego il programma... ovviamente esegue solo la
sostituzione di DO* e DO# in DO# e RE... sono accetti tutti i suggerimenti
possibili immaginabili... nonché la soluzione del problema!
Tra l'altro penso ci siano degli errori nella seconda pare che non riesco a
correggere perché il programma si pianta prima di arrivare...
Francesco D'Offizi
fdof...@tin.it
---
#include <stdio.h>
#define maxele 300
void main()
{
int n=0;
int i;
char nseq[maxele];
char seq[]="DO# DO";
printf("%s\n", seq);
if (seq[i]=='D') // Inizia a cercare nella stringa e si ferma se trova D //
 {
  if (seq[i+1]=='O' && seq[i+2]!='#') // Se dopo D c'è O e non anche #
allora esegue: //
  {
  nseq[n]='D';
  nseq[n+1]='O';
  nseq[n+2]='#';
  n+=3;
  for (i=2;seq[i]!=' ';i++) // Aggiunge tutto quello che c'è dopo l'accordo
(settime... etc...) //
   {
   nseq[n]=seq[i];
   n++;
   }
  }
  else if(seq[i+1]=='O' && seq[i+2]=='#') // Se non trova il # //
  {
  nseq[n]='R';
  nseq[n+1]='E';
  n+=2;
  for (i=3;seq[i]!=' ';i++) // Aggiunge gli attributi minori dell'accordo
:))) //
   {
   nseq[n]=seq[i];
   n++;
   }
  }
 }
for(; seq[++i]=='D';)
{
 if (seq[i+1]=='O' && seq[i+2]!='#') // Se dopo D c'è O e non anche # allora
esegue: //
  {
  nseq[n]='D';
  nseq[n+1]='O';
  nseq[n+2]='#';
  n+=3;
  for (i=2;seq[i]!=' ';i++) // Aggiunge tutto quello che c'è dopo l'accordo
(settime... etc...) //
   {
   nseq[n]=seq[i];
   n++;
   }
  }
  else if(seq[i+1]=='O' && seq[i+2]=='#') // Se non trova il # //
  {
  nseq[n]='R';
  nseq[n+1]='E';
  n+=2;
  for (i=3;seq[i]!=' ';i++) // Aggiunge gli attributi minori dell'accordo
:))) //
   {
   nseq[n]=seq[i];
   n++;
   }
  }
}
printf("%s\n", nseq);
}

if (seq[i]=='D') // Inizia a cercare nella stringa e si ferma se trova D //
Notiamo subito che la variabile i *non e` inizializzata*; il suo valore
e` dunque totalmente "casuale ed arbitrario".  Applicando un numero
arbitrario e casuale come indice di un array, ci troviamo a cercare di
indirizzare un punto casuale e arbitrario della memoria, e non e`
dunque difficile rendersi ragione del perche` un sistema operativo
puo` diagnosticare violazione d'indirizzamento!
Puo` darsi che vi siano anche altri problemi, non ho esaminato oltre
il codice dopo aver visto questo gia` di per se sufficiente.
Alex

Inanzitutto son mesi che no nfaccio più nente in C ed ero alle prime
armi anch'io.Cmq tanto per vedere se ricordo ancora qlc ho provato a
fare la seguente funzioncina che potrebbe esssere meglio fatta
senz'altro,ma devo ripassare parecchia roba:-)
Anche se non ho capito bene cosa intendi questa dovrebbe servire a
qlc(almeno spero) oppure a darti uno spunto verso un'altra soluzione
chissa..' :-)
-----------------------------------------------------------------------------------------------------------------------
/*Siccome il compito di questa funzione "sostituisci()" 
*potrebbe essere eseguito spesso ho pensato definire un modulo
*separato che può essere richiamato tutte le volte che c'è
*n'è bisogno. 
*/
char sostituisci(char ar[],int n,int c,int dimension){
 
	char
ar2[18]={'D','O','#','R','E','M','I','F','A','S','O','L','L','A','S','I','D','O',};
 
	if (dimension == 2)
              for(;dimension !=0;dimension--,n++){
                  ar[n] = ar2[c];
 
			}
	else 
	       if (dimension == 3)
                     for(;dimension !=0;dimension--,n++){ 
                         ar[n] = ar2[c];
	        }
 
             else 
                    exit(1);           
return(0);
}
------------------------------------------------------------------------------------------------------------------
Non sono un musicista :-)ma se non sbaglio le note sono quelle che ho
inserito nell'array.
Se passi a sostituisci() l'array ar[] o un puntatore ad ar,un numero
intero 'n' che coincide con l'indice del primo carattere che vuoi
cambiare,un numero intero 'c' che coincide con l'indice del nuovo
carattere da immettere nell'array e un intero associato a dimension
che specifica se i caratteri da sostituire sono due oppure tre forse
funge :-)
Ho fatto cosi perchè tra le note c'è il 'sol' che ha tre lettere in
questo modo hai la possibilita' di sostituire qualsiasi nota musicale.
Mentre la tua cambiava solo le occorrenze di DO e RE questa ha scelta
libera nel senso che non effettua alcun controllo sugli indici in
entrata di ar[].
Mi son dimenticato i diesis!!Se poi funge e ti piace ti basta
aggiungerli all'array ar[].
Ciao!
                  Paolo
Tentar non nuoce

On Thu, 07 Jan 1999 23:18:30 GMT, 
fl...@chierinet.it
 (Paolo) wrote:
Non ho messo neanche l'algoritmo per la ricerca!
cmq ci studiero' un po' su.
Ciaoi1

 possibili immaginabili... nonché la soluzione del problema!
Eccoti la soluzione. Compilato con gcc sotto Linux funziona
perfettamente.
Ciao.
kalb
#include <stdio.h>
#define maxele 300
void main(){
    int n=0;
    int i=0;
    char nseq[maxele];
    char seq[]="DO#7+9- DO";
    printf("%s\n", seq);
    // Inizia a cercare nella stringa e si ferma se trova D //
    if (seq[i]=='D') {
 if (seq[i+1]=='O' && seq[i+2]!='#') {
     // Se dopo D c'e' O e non anche # allora esegue:
         nseq[n]='D';
     nseq[n+1]='O';
            nseq[n+2]='#';
            n+=3;
     // Aggiunge tutto quello che c'e' dopo l'accordo (settime...
etc...) //
  for (i=2;seq[i]!=' ';i++) {
      nseq[n]=seq[i];
      n++;
  }
 } else if(seq[i+1]=='O' && seq[i+2]=='#') {
     // Se trova il # //
     nseq[n]='R';
     nseq[n+1]='E';
     n+=2;
     // Aggiunge gli attributi minori dell'accordo:))) //
     for (i=3;seq[i]!=' ';i++) {
         nseq[n]=seq[i];
         n++;
     }
     // Inserisce il terminatore di stringa
     nseq[n] = 0x00;


 
fdof...@tin.it
Non tento nemmeno di commentare il codice perche', oltre ad errori palesi
come void main() e l'uso di i non inizializzato e' un esempio perfetto di
programmazione non strutturata. Molte della manipolazioni di stringhe sono
gia' contenute nella libreria standard C, i cui prototipi sono in <string.h>.
strstr(cs,ct); dove cs e ct sono stringhe ti ritorna un puntatore in cs dove
appare ct . A questo punto la sostituzione si puo' fare spezando la stringa
originale nelle parti prima della stringa da sostituire, la stringa da
sostituire e dopo. Con strcpy si puo' sostiture la stringa da sostituire con
quella nuova e poi usare strcat per rimetterle assieme. Ora devi considerare
questo algoritmo e dividerlo nelle operazioni basilari e scrivere una
funzione per ognuna di esse utilizzandi il piu' possibile le funzioni in
string.h per le oprazioni elementari. Buona fortuna Ciao Paolo
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own    

Francesco D'Offizi (
fdof...@tin.it
) wrote:
: Ho un problemino... ho da pochissimo iniziato a studiare il C e mi sono
: imbattuto nella complicata gestione delle stringhe di testo... ho provato a
: fare un programma che, definita, almeno per ora, una stringa ricercasse
: all'interno di essa un testo e lo sostituisse con un altro (l'idea è quella
: di fare un prog. che dati gli accordi di una canzone possa aumentare o
: diminuirne la tonalità)... purtroppo a un certo punto mi sono imbattuto in
: errori di sistema nel kernel di W98 o nel file eseguibile (a seconda della
: dimensione di un array)... allego il programma... ovviamente esegue solo la
: sostituzione di DO* e DO# in DO# e RE... sono accetti tutti i suggerimenti
: possibili immaginabili... nonché la soluzione del problema!
Questa e' facile: non hai inizializzato i !
Non ho capito troppo del tuo sorgente ;)
Cosi' lo ho riscritto un pochino. Mi pare fosse questo che volevi
fare:
-------------------------------------------------------------
#include <stdio.h>
#define MAXEL 300
int main()
{
        int n = 0, i = 0;
        char nseq[MAXEL];
        char seq[] = "DO# DO DO DO DO# DO";
        printf("Sequenza originale:\t%s\n", seq);
        while (seq[i]) {
                if ((seq[i] == 'D') && (seq[i + 1] == 'O')) {
                        if (seq[i + 2] == '#') {
                                nseq[n++] = 'R';
                                nseq[n++] = 'E';
                                i += 3;
                        } else {
                                nseq[n++] = 'D';
                                nseq[n++] = 'O';
                                nseq[n++] = '#';
                                i += 2;
                        }
                } else {
                        nseq[n++] = seq[i++];
                }
        }
        nseq[n] = '\0';
        printf("Sequenza modificata:\t%s\n", nseq);
        return 0;
}
-------------------------------------------------------------
Giusto ?
Ciao ciao
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)