Pagina 1 di 1

Un classico: il frasario di Cesare[Risolto!]

Inviato: lun 6 lug 2009, 18:32
da Blallo

Codice: Seleziona tutto

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLN 80

int main()
{
	char strIN[MAXLN], strOUT[MAXLN], strWORK[MAXLN];
	FILE *fpIN, *fpOUT;
	int code, i, c;

	printf("Inserire nome file:");
	scanf("%s",&strIN);
	if((fpIN=fopen(strIN,"r"))==NULL)
	{
		fprintf(stderr,"Errore apertura file");
		return EXIT_FAILURE;
	}
	printf("Inserire codice:");
	scanf("%d",&code);
	printf("Inserire nome output:");
	scanf("%s",&strOUT);
	if((fpOUT=fopen(strOUT,"w"))==NULL)
	{
		fprintf(stderr,"Errore creazione output");
		return EXIT_FAILURE;
	}

	while((fgets(strWORK,MAXLN,fpIN))!=NULL)
	{
		for(i=0;i<strlen(strWORK);i++)
		{	
			c=strWORK[i];
			if(islower(c))
			{
				toupper(c);
				if(c>=('Z'-code+1))
					c='Z'-c+1-code;
				else
					c+=code;
				tolower(c);
				strWORK[i]=(char)c;
			}
			else
			{
				if(c>=('Z'-code+1))
					c='Z'-c+1-code;
				else
					c+=code;
				strWORK[i]=(char)c;
			}		
		}
		fputs(strWORK,fpOUT);
	}

	fclose(fpIN);
	fclose(fpOUT);
	return EXIT_SUCCESS;
}
devo creare un programma che dato un valore mi "sposti" le lettere dell'alfabeto di quel tot di valori e che dato un file di input me lo converta. Ora questo riconosce correttamente le lettere ma me le sostituisce con caratteri "scemi". cosa può essere?

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 18:39
da Mario Vanoni
man rot13
il codice e` in Slackware,
come spunto ...

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 18:45
da FireEater
E' normale, stai sommando o sottraendo un valore al codice ASCII della lettera che leggi, se superi la A o la Z vengono stampati altri caratteri...

CONTROLLA QUEL toupper. :evil:

Ciao
FE

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 18:55
da m0rdr3d
secondo la documentazione in rete, la funzione toupper non modifica il parametro sul posto, ma ritorna il carattere modificato.
Per cui, nel tuo codice, è come se non facessi la chiamata alla funzione.

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 19:04
da FireEater
Eh.. ma così non vale :lol: jimmy_page_89 ci sarebbe dovuto arrivare da solo :D

Aldilà della documentazione si nota subito che una variabile allocata sullo stack e passata per valore non può essere modificata da una funzione.

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 19:17
da Gugli
Inoltre stai attento anche qui:

Codice: Seleziona tutto

<< scanf("%s",&strOUT);
>> scanf("%s", strOUT);

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 19:25
da FireEater
Già... ma probabilmente jimmy_page_89 non ha ancora studiato il significato di "&" e di passaggi per valore o riferimento.
Sono errori normali e se continuerà ad esercitarsi con questo ritmo spariranno presto. :thumbright:

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 19:38
da Blallo
m0rdr3d ha scritto:secondo la documentazione in rete, la funzione toupper non modifica il parametro sul posto, ma ritorna il carattere modificato.
Per cui, nel tuo codice, è come se non facessi la chiamata alla funzione.
esattamente questo è il rpoblema...ho risolto uguagliandolo a una variabile int che poi ho provveduto anche a dare in pasto al resto della funzione
ora funziona perfettamente! Grazie!

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 20:00
da m0rdr3d
FireEater ha scritto:Eh.. ma così non vale :lol: jimmy_page_89 ci sarebbe dovuto arrivare da solo :D

Aldilà della documentazione si nota subito che una variabile allocata sullo stack e passata per valore non può essere modificata da una funzione.
Infatti ho cercato di dare più un'indicazione che la soluzione, ma forse sono stato un po' troppo generoso ;-)

Re: Un classico: il frasario di Cesare

Inviato: lun 6 lug 2009, 20:45
da Blallo
m0rdr3d ha scritto:Infatti ho cercato di dare più un'indicazione che la soluzione, ma forse sono stato un troppo generoso ;-)
la ringrazio della clemenza e disopnibilità accordatami :mille: