Un classico: il frasario di Cesare[Risolto!]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Blallo
Packager
Packager
Messaggi: 3300
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Un classico: il frasario di Cesare[Risolto!]

Messaggio 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?
Ultima modifica di Blallo il lun 6 lug 2009, 21:09, modificato 1 volta in totale.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Un classico: il frasario di Cesare

Messaggio da Mario Vanoni »

man rot13
il codice e` in Slackware,
come spunto ...

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: Un classico: il frasario di Cesare

Messaggio 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

Avatar utente
m0rdr3d
Linux 2.x
Linux 2.x
Messaggi: 404
Iscritto il: dom 24 dic 2006, 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: Un classico: il frasario di Cesare

Messaggio 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.

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: Un classico: il frasario di Cesare

Messaggio 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.

Gugli
Linux 0.x
Linux 0.x
Messaggi: 6
Iscritto il: lun 6 lug 2009, 19:15
Slackware: 13.0
Kernel: 2.6.32.7
Desktop: KDE

Re: Un classico: il frasario di Cesare

Messaggio da Gugli »

Inoltre stai attento anche qui:

Codice: Seleziona tutto

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

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: Un classico: il frasario di Cesare

Messaggio 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:

Avatar utente
Blallo
Packager
Packager
Messaggi: 3300
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: Un classico: il frasario di Cesare

Messaggio 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!

Avatar utente
m0rdr3d
Linux 2.x
Linux 2.x
Messaggi: 404
Iscritto il: dom 24 dic 2006, 13:40
Slackware: Slackware64-current
Kernel: 3.4.*
Desktop: KDE 4.8.2

Re: Un classico: il frasario di Cesare

Messaggio 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 ;-)
Ultima modifica di m0rdr3d il lun 6 lug 2009, 21:04, modificato 1 volta in totale.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3300
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: Un classico: il frasario di Cesare

Messaggio 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:

Rispondi