Come promesso eccomi qui:
allora char * parola [numero];
in realtà è uguale a char parola [/*indefinito*/][numero];
quindi bisognava dichiarare char parola [numero];
Questo perchè la stringa è un array di char (char * o char []) terminante in automatico con \0 = NULL.
Il valore successivo a NULL non è accessibile.
es. char * var = "cane"; var[0] = 'c' , var[1] = 'a', var[2] = 'n', var[3] = 'e', var[4] = NULL, var[5] non accessibile, etc...
Quindi quello che avevi scritto char * word [numero]; in realtà è un array di array di char: cioè un array di stringhe.
Spero di essere stato chiaro.
Comunque già che c'ero oggi ho dato una sistemata al programma:
Andava bene tutto ma ho modificato qualcosa:
1) Ho usato un ciclo al posto del goto: il goto andava comunque benissimo ma io ti consiglio di non usarlo perchè rende meno robusto il codice.
2) Ho fatto in modo che il programma giri all'infinito: eri benissimo in grado di farlo anche te, ma già che c'ero l'ho fatto.
3) Ho sostituito il system("PAUSE"); con una funzione che viene richiamata e svolge la stessa funzione di system ma è più leggibile perchè puoi modificare l'output a tuo piacimento.
4) Infine, e questa non è una cosa di cui si poteva fare a meno come quelle di prima:
Se digitavi un input di più interi es "32424" o di un char o più es 'k' o "shkh", il programma non gestiva l'eccezione e andava in "balla" ripetendo il goto all'infinito o in caso di caratteri multipli lo ripeteva più volte. Non so se te ne eri accorto ma in caso contrario prova a "inputare" quello che ti ho detto e tutto ti sarà chiaro.
Per fronteggiare a questo ho fatto in modo che l'input fosse un char * (stringa) e che venisse considerata con la funzione atoi (che trasforma char a int) il primo carattere della stringa (considerando solo il primo carattere vengono evitati gli imput di più caratteri).
In questo modo ripeto con il primo carattere della stringa viene valutato e gli altri ingnorati: es. input "cane". atoi trasforma 'c' in intero cioè 0.
Nota atoi() non converte il char a int semplicemente ma se il char è '1' l'int è 1 non l'int corrispondente nella tabella char che in questo esmpio sarebbe 49. Se il carattere convertito da atoi() non è un numero ma un qualsiasi char l'int corrispondente risulta 0.
altro es. input "2cane" il progrmma funzionerebbe correttamente se non avessi scritto
if((atoi(&chooseChar[0])==1 || atoi(&chooseChar[0])==2) && chooseChar[1] != NULL) choose = 0; //se il primo carattere dell'input è 1 o 2 e il secondo è un altro carattere chose = 1
in questo caso il valore choseChar[1] == 'c' pertanto choose viene assegnato a 0
infine se digito "2" o "1" come input il secondo valore del vettore chooseChar è NULL pertanto tutto funziona perfettamente.
Infine c'erano altre piccole incertezze sul codice:
if(){/*istruzioni*/}va scritto senza ; finale.
NON if(){/*istruzioni*/}; questo potrebbe procurarti problemi in caso di if(){}else;
Nei blocchi {} è già "incluso" il ; quindi if(){}; else; non è lecito e da errore di compilazione.
Infine l'ultimissima incertezza sta nei prototipi della funzione:
char * cripta(char*); //Dichiaro il prototipo della funzione per criptare.
char * cripta(char*); //Dichiaro il prototipo della funzione per decriptare. ERRORE
il secondo prototipo è decripta non cripta di nuovo. Esso non ti ha dato errore di compilazione perchè le funzioni sono "esplicate" (scusa per il termine inventato ma non sapevo trovare di meglio xD", vedi //1 e //2 nel codice), prima della chiamata della funzione cripta(); e decripta();.
Se invece "esplicavi" le funzioni (xD) dopo la funzione main senza prototipi di funzione il progetto non verrebbe compilato.
CODICE:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define Max_word 99
// Si ringrazia kirakira93 per l'aiuto //Sviluppatore : salvy
char * cripta(char*); //Dichiaro il prototipo della funzione per criptare.
char * decripta(char*); //Dichiaro il prototipo della funzione per decriptare.
int MeglioDelGoto(int);
void InveceDiSystemPAUSE(char *);
int MeglioDelGoto(int choose)
{
char word[Max_word];
char * string;
int aggiunta;
if(choose==1){
printf("\nScrivi la parola da codificare\n");
scanf("%s",&word);
printf("\nSto codificando...");
for(aggiunta = 0; aggiunta < 20; aggiunta++){
printf(".");
Sleep(70);
}//questo l'ho aggiunto io per bellezza
Sleep(100);
string=cripta(word);
printf("\n%s\n\n",string);
return 1;
}
if(choose==2){
printf("\nScrivi la parola da decodificare\n");
scanf("%s",&word);
printf("\nSto decodificando...");
for(aggiunta = 0; aggiunta < 20; aggiunta++){
printf(".");
Sleep(70);
}
Sleep(100);
string=decripta(word);
printf("\n%s\n\n",string);
return 1;
}
if(choose!=1&&choose!=2){
printf("Scelta non consentita: scegliere 1 o 2\n");
return 0;
}
Sleep(1);
}
char * cripta(char * word)//1 da qui è "esplicata" la funzione cioè sono illustrati i compiti che deve fare
{
int j=0;
int l=strlen(word);
int temp;
while(j<l){
temp=word[j];
temp++;
if(temp == 123){
temp = 97;
}
/* il carattere 'z' è 122 sommato a 1 risulta il caattere ascii '{'
* pertanto il valore deve essere portato manualmente al valore di
* 'a' cioè 97. */
if(temp == 91){
temp = 65;
}
//Il carattere stavolta è 'Z'
word[j]=temp;
j++;
} //Fine while
return word;
}//1 Fino a qui
char * decripta(char * word)//2
{
int j=0;
int l=strlen(word);
int temp;
while(j<l){
temp=word[j];
temp--;
if(temp == 96){
temp = 122;
}
if(temp == 64){
temp = 90;
}
word[j]=temp;
j++;
}
return word;
}//2 Fino a qui
int main(int argc, char *argv[])
{
MessageBox (NULL,"Sviluppatore salvy\nSi ringrazia kirakira93 per l'aiuto ","Special Thanks",0);
//Premi ok
char chooseChar[Max_word];
int choose;
int RipetizioneProgramma;// = 0;
printf("Benvenuti! Questo programma e' scritto per codificare e decodificare parole.\n");
//se devi fare gli accenti scrivi così e' non è xkè altrimenti il compilatore lo trasforma in caratteri diversi:
//la conversione tra ascii e unicode genera questa incompatibilità
Sleep(1);
do{
printf("\nVuoi codificare (1), o decodificare (2) una parola?\n");
for(int MeglioUnCicloCheIlGoto = 0; MeglioUnCicloCheIlGoto < 1; )
{
scanf("%s", chooseChar);
choose = atoi(&chooseChar[0]);
if((atoi(&chooseChar[0])==1 || atoi(&chooseChar[0])==2) && chooseChar[1] != NULL) choose = 0;
if(MeglioDelGoto(choose) == 1) MeglioUnCicloCheIlGoto = 1;
//se il return della funzione MeglioDelGoto è 1 il ciclo termina e di coseguenza il programma
}
InveceDiSystemPAUSE("continuare");
//Andava benissimo anche PAUSE ma questo mi è più simpatico perchè il codice è più leggibile! :)
}while(RipetizioneProgramma == 0);
return 0;
}
void InveceDiSystemPAUSE(char * istruzione) {
printf("\n\tPremere return per %s", istruzione);
fflush(stdin);
getchar();
}
THIS IS ALL!