Newsgroup: it.comp.lang.c
Titolo: esercizi con array

Salve,
sto cercando di scrivere un prog che cifri una stringa in input con
l'algoritmo di cesare. In pratica, ogni carattere della stringa viene
sostituito con il carattere corrispondente shiftato di N posizioni.
Il mio prog (sotto) non funge...
Se metto lo shift a 1, funziona correttamente, sembra. Con shift = 2
anche, ma con shift = 3 l'array_crypto non viene visualizzato anche se
contiene i caratteri giusti (lo vedo dai printf di test).
Cos'e' che non va?? Nelle mie prove immetto la stringa iniziale 'abc' e
'xyz' (alfabeto inglese, 26 lettere), i casi estremi.
In aggiunta, i printf di test mi dicono che con stringhe iniziali di 3
caratteri, i vettori array e array_char hanno dimensione 4. Perche'?
Scusate i dubbi da niubbo...
Se servisse, uso linux e gcc.
Grazie in anticipo,
mirko
#include<stdio.h>
#define SHIFT 3
int main (void)
{
	int i, k,array[26], array_crypto[26];
	char c;
 
	i=0;
	while ((c=getchar())!=EOF) {
		if (c+SHIFT<='z') {
			array[i]=c; printf("array[%d]=%c\n",i,array[i]);
			array_crypto[i]=c+SHIFT; /* test */
printf("array_crypto[%d]=%c\n",i,array_crypto[i]);
			i++;
		}
		if (c+SHIFT>'z') {
			array[i]=c; printf("array[%d]=%c\n",i,array[i]);
			array_crypto[i]=c+SHIFT-26; /* test */
printf("array_crypto[%d]=%c\n",i,array_crypto[i]);
			i++;
		}
	}
 
	printf("\noriginale\n");
 
	k=0;
	while (k<i) {
		printf("%c", array[k++]);
 
	}
 
	printf("\n");
 
	printf("crypto\n");
	k=0;
	while (k<i) {
		printf("%c", array_crypto[k++]);
 
	}
	return 0;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Se servisse, uso linux e gcc.
allora compilalo con gli switch -O0 -g e poi
invocalo dal debugger visuale: ddd
ddd mioprogramma
cosi' impari a trovare gli errori da solo.
alternativamente eseguilo passo-passo sulla carta,
facendoti delle tabelline per rappresentare
le variabili, gli array, etc.
vedrai che l'errore lo trovi.
nb.

 caratteri, i vettori array e array_char hanno dimensione 4. Perche'?
non e' che stai leggendo anche i fine-linea ?
in ogni caso l'assegnamento c=getchar() e' sbagliato
perche' hai definito c come char, mentre la getchar
(sotto linux: man getchar )
restituisce, per ovvi motivi, un int.
ciao,
g.

 restituisce, per ovvi motivi, un int.
grazie per la celere risposta :-)
guarda, non so perche', ma se nel primo while metto come condizione
c!='\n' anziche' c!=EOF, funziona a meraviglia.
while ( /* (c=getchar())!=EOF */ (c=getchar())!='\n') {
c definito come int o char non fa alcuna differenza.
mah...


 mah...
Dai per scontato che dal file leggi sempre una lettera minuscola (codice
ASCII compreso tra 'a' e 'z').
Devi mettere un controllo controllando che sia compreso tra 'a' e 'z' (e se
vuoi tra 'A' e 'Z' per le lettere maiuscole).
Ad esempio caratteri di controllo come Carriage Return (0x0D) o Line Feed
(0x0A) hanno codice ASCII minore di 'a' e quindi nel tuo software ci vai a
sommare SHIFT ottenendo un altro carattere di controllo.
Altra cosa.
Hai definito i 2 array di dimensione pari a 26 (proprio pari alla numero di
lettere dell'alfabeto!!!).
Ma se nel file sono presenti più di 26 caratteri, fai un bel disastro
sforando la dimensione del vettore. Ci vuole un controllo sul numero di
caratteri letti che non deve superare la dimensione dell'array.