Ho inviato il programma questa mattina alle 3 .. alla fine sono tornato ad usare un ciclo per le conversioni. così uso una parola per volta e non c'è quindi rischio di overflow. ho provato a modificare la funzione Replace ma continuava a dare errori quindi, per mancanza di tempo sono tornato alla funzione iniziale.
comunque, ecco la soluzione finale:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 600
char * Replace(char *origin, char *old, char *new)
{
char *sms_out = (char*)malloc(sizeof(char)*strlen(origin));
char *tmp = (char*)malloc(sizeof(char)*strlen(origin));
sms_out = strcpy(sms_out, origin);
char *pos;
while((pos = strstr(sms_out, old)) != NULL)
{
memset(tmp, 0, strlen(tmp));
tmp = strncpy(tmp,sms_out, pos - sms_out);
tmp = strcat(tmp, new);
tmp = strcat(tmp, pos + strlen(old));
sms_out = strcpy(sms_out, tmp);
}
free(tmp);
free(origin);
sms_out = (char*)realloc(sms_out, sizeof(char)*strlen(sms_out));
return sms_out;
}
int main(int argc, char ** argv)
{
char sms_in[MAX];
char *mystring, *sms_out;
FILE *fp, *fr;
remove("sms_in.txt");
remove("sms_out.txt");
printf("Inserire il testo da convertire e premere invio:\n");
do{
scanf("%s", sms_in);
fp = fopen("sms_in.txt", "a");
if (fp == NULL)
{
printf("Errore nell'apertura del file.\n");
return 1;
}
fprintf(fp, "%s ", sms_in);
rewind(fp);
mystring = (char*)malloc(sizeof(char) * strlen(sms_in)+1);
mystring = strcpy(mystring,sms_in);
#include "comprsms.h"
printf("%s ",sms_out);
fr = fopen("sms_out.txt", "a");
if (fr == NULL)
{
printf("Errore nell'apertura del file.\n");
return 1;
}
fprintf(fr, "%s ", sms_out);
rewind(fr);
}while(getchar() != '\n');
printf("\n");
fflush(fp);
fflush(fr);
fclose(fp);
fclose(fr);
exit(0);
}
il file comprsms.h contiene le conversioni:
sms_out = Replace(mystring, "ch", "k");
sms_out = Replace(sms_out, "per", "x");
sms_out = Replace(sms_out, "come", "cm");
sms_out = Replace(sms_out, "questo", "qst");
sms_out = Replace(sms_out, "niente", "nnt");
sms_out = Replace(sms_out, "non", "nn");
sms_out = Replace(sms_out, "oggi", "gg");
sms_out = Replace(sms_out, "uno", "1");
sms_out = Replace(sms_out, "sono", "sn");
sms_out = Replace(sms_out, "tutto", "tt");
sms_out = Replace(sms_out, "tutta", "tt");
sms_out = Replace(sms_out, "cosa", "cs");
sms_out = Replace(sms_out, "una", "1");
sms_out = Replace(sms_out, "comunque", "cmq");
sms_out = Replace(sms_out, "bene", "bn");
sms_out = Replace(sms_out, "sei", "6");
sms_out = Replace(sms_out, "destra", "dx");
sms_out = Replace(sms_out, "sinistra", "sx");
sms_out = Replace(sms_out, "numero", "num");
sms_out = Replace(sms_out, "dopo", "dp");
sms_out = Replace(sms_out, "sms_outpondi", "sms_outp");
sms_out = Replace(sms_out, "sms_outponde", "sms_outp");
sms_out = Replace(sms_out, "Ch", "K");
sms_out = Replace(sms_out, "Per", "X");
sms_out = Replace(sms_out, "Come", "Cm");
sms_out = Replace(sms_out, "Questo", "Qst");
sms_out = Replace(sms_out, "Niente", "Nnt");
sms_out = Replace(sms_out, "Non", "Nn");
sms_out = Replace(sms_out, "Oggi", "Gg");
sms_out = Replace(sms_out, "Uno", "1");
sms_out = Replace(sms_out, "Sono", "Sn");
sms_out = Replace(sms_out, "Tutto", "Tt");
sms_out = Replace(sms_out, "Cosa", "Cs");
sms_out = Replace(sms_out, "Una", "1");
sms_out = Replace(sms_out, "Comunque", "Cmq");
sms_out = Replace(sms_out, "Bene", "Bn");
sms_out = Replace(sms_out, "Sei", "6");
sms_out = Replace(sms_out, "Destra", "Dx");
sms_out = Replace(sms_out, "Sinistra", "Sx");
sms_out = Replace(sms_out, "Numero", "Num");
sms_out = Replace(sms_out, "Dopo", "Dp");
sms_out = Replace(sms_out, "sms_outpondi", "sms_outp");
sms_out = Replace(sms_out, "sms_outponde", "sms_outp");
sms_out = Replace(sms_out, "CH", "K");
sms_out = Replace(sms_out, "PER", "X");
sms_out = Replace(sms_out, "COME", "CM");
sms_out = Replace(sms_out, "QUESTO", "QST");
sms_out = Replace(sms_out, "NIENTE", "NNT");
sms_out = Replace(sms_out, "NON", "NN");
sms_out = Replace(sms_out, "OGGI", "GG");
sms_out = Replace(sms_out, "UNO", "1");
sms_out = Replace(sms_out, "SONO", "SN");
sms_out = Replace(sms_out, "TUTTO", "TT");
sms_out = Replace(sms_out, "COSA", "CS");
sms_out = Replace(sms_out, "UNA", "1");
sms_out = Replace(sms_out, "COMUNQUE", "CMQ");
sms_out = Replace(sms_out, "BENE", "BN");
sms_out = Replace(sms_out, "SEI", "6");
sms_out = Replace(sms_out, "DESTRA", "DX");
sms_out = Replace(sms_out, "SINISTRA", "SX");
sms_out = Replace(sms_out, "NUMERO", "NUM");
sms_out = Replace(sms_out, "DOPO", "DP");
sms_out = Replace(sms_out, "sms_outPONDI", "sms_outP");
sms_out = Replace(sms_out, "sms_outPONDE", "sms_outP");
sono 64 in tutto. e nei file sms_in.txt ed sms_out.txt salvo il testo originale e quello compresso.
volevo evitare il ciclo ma alla fine, forse è la soluzione migliore..
grazie comunque per l'aiuto