[C] Scrivere a fine stringa.

cristian.migotto
Salve ho scritto questo codice che converte una stringa comprimendola
Es AAAAAAAAEE
in A8E2
Però quando uso la sprintf mi cancella i valori precedentemente inseriti quindi il programma funziona solo se inserisco un tipo di lettera, vorrei trovare un modo per scrivere a fine di una stringa perchè poi questa stringa deve essere inserita in un file e non deve andare a capo ogni volta che comprime.
Ho segnato l'errore con una freccia------>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
    int i,l=0,cont=1;
    char riga[513],rigaf[1025],carattere,bl[513];
    gets(riga);
    printf("%s\n",riga);
 
    l=strlen(riga);
    printf("lunghezza riga %d\n",l);
    if(l>0)
        {
         carattere=riga[0];
         for(i=0;i<l;i++)
            {
             if(isupper(riga[i]))
               {
                if(carattere==riga[i+1])
                    {
                     cont++;
                    }
                   else
                   {
       --------->   sprintf(rigaf,"%c%d",carattere,cont);

                   cont=1;
                   carattere=riga[i];

                   }

               }
               else
                {
                i=l;
                printf("Errore caratte non maiuscolo o diverso da lettere rilevato salto riga");
                }




            }


        }

        printf("%s",rigaf);
    return 0;

}

Risposte
apatriarca
sprintf scrive a partire dal primo byte della stringa passata come primo argomento. Per poter scrivere più avanti devi passare una stringa diversa. Se dai una occhiata per esempio in questa pagina vedrai che la stringa restituisce il numero di caratteri scritti. Devi quindi tenere un contatore che viene incrementato ad ogni chiamata della funzione e devi aggiungere alla stringa. Se pos è il nome di questo contatore, allora devi scrivere:
pos += sprintf(rigaf+pos, "%c%d", carattere, cont);

Va ovviamente inizializzato a zero.

cristian.migotto
"apatriarca":
CODICE: SELEZIONA TUTTO
pos += sprintf(rigaf+pos, "%c%d", carattere, cont);
Grazie, però non mi è chiaro perché se addizioni un numero, in questo caso il numero di caratteri già scritti alla stringa, la sprintf inizia a scrivere la saltando quel numero di caratteri.

apatriarca
Si chiama aritmetica dei puntatori e se non l'hai fatta mi porterebbe troppo lontano. Diciamo che quella scritta è equivalente a &rigaf[pos] e restituisce una stringa che inizia a partire dalla posizione pos.

cristian.migotto
Si non sapevo l'esistenza di una simile cosa, comunque ottimo davvero utile!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.