VoV (Ex-Member)
Newbie
Messaggi: 7
Iscritto: 29/11/2008
|
Buonasera a tutti avrei un problema per quanto riguarda le stringhe;
in poche parole io sto creando un crypter con un algoritmo piuttosto semplice, ovvero
inserita una parola o più le lettere verranno spostate di N caratteri dove N è la lunghezza della stringa, con l'aggiunta del numero in questione prima e dopo la stringa criptata; quindi avremo ciao = 4gmes4
fin qui tutto ok.
il problema è l'inverso ovvero quando vado a decrittare 4gmes4 dovrebbe restituirmi solo ciao, mentre, ovviamente restituisce 0ciao0 vorrei chidere se siete a conoscenza del metodo per cui potessi tagliare il primo e l'ultimo carattere
so che esiste la funzione strtok() ma ho qualche difficoltà a utilizzarla
e so anche che potrei far si che la stringa venga considerata da un carattere dopo e farla finire con \0 però non ho bene idea sul come fare se potreste postarmi un abbozzo di codice ve ne sarei grato
scusate per la lunghezza ^^
il mio source è questo
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <string.h> #include <stdlib.h> void crypt(); void decrypt(); int main() { int scelta; printf("Crypter/Decrypter\n\n"); printf("Non inserire spazi tra le parole, ma inserisci _\n"); printf("Massimo 100 caratteri\n"); printf("\n1)Criptare \n2)Decriptare \n3)Esci\n"); printf("\nScegli un'operazione: "); scanf("%d", &scelta); switch (scelta){ case 1: crypt(); break; case 2: decrypt(); break; case 3: return 0; break; default: getchar(); printf("\nNumero non valido\n"); getchar(); printf("\nPremere un tasto per uscire"); break; } } void crypt() { int pos,j; char frase[100]; printf("\nTesto da criptare: "); scanf("%99s",&frase); strcat(frase,"\0"); pos = 0; j = strlen(frase); while(frase[pos]!='\0' && (pos < j )){ frase[pos] += j; pos++; } printf("Testo criptato: %d%s%d\n\n",j , frase, j ); getchar(); printf("\nPremere un tasto per uscire"); getchar(); } void decrypt() { int pos,j,x; char frase[100]; printf("\nTesto da decriptare: "); scanf("%99s", &frase); strcat(frase,"\0"); pos = 0; j = strlen(frase); while(frase[pos]!='\0' && (pos < j)){ frase[pos] -= (j - 2); pos++; } x[frase] = 1; printf("Testo decriptato: %s\n\n", x); getchar(); printf("\nPremere un tasto per uscire"); getchar(); }
|
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Un attimo ... il valore che inserisci prima e dopo, non e' detto che sia di una sola cifra ... dato che usi la lunghezza della stringa, questo puo' essere tra 1 e 3 cifre ... giusto?
|
|
Lawliet (Normal User)
Expert
Messaggi: 386
Iscritto: 09/04/2009
|
scanf("%99s", &frase); <--- una piccola nota... sicuro che bisogna usare indirizzo per un array?
Ultima modifica effettuata da Lawliet il 08/06/2009 alle 2:05 |
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
se non mi sbaglio esiste una funzione substr che permette di estrarre una sottostringa da una stringa, potrebbe fare al caso tuo.
Ciao.
Luigi
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Postato originariamente da gigisoft:
... funzione substr ... |
In C ... ?
Mi sa che fai confusione con qualche altro linguaggio/libreria ... |
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da theprogrammer:
In C ... ?
Mi sa che fai confusione con qualche altro linguaggio/libreria ... |
D'oh!!!
Si hai ragione ( + o - )
in realta' substr e' una funzione della classe string ( in C++ quindi, non in C )
in C non so... |
|
()
Newbie
Messaggi:
Iscritto:
|
in ctype.h si trovano le varie funzioni
-isdigit
-isalpha
-isalphanum
e altre di minore importanza.
se vuoi fare una cosa semplice potresti fare una cosa del genere:
Codice sorgente - presumibilmente Plain Text |
if(isalpha(carattere))
tua_stringa[indice] = carattere;
|
cosi elimini i numeri all'inizio e alla fine, ma anche quelli in mezzo, quindi hai la limitazione di poter criptare solo caratteri alfabetici
|
|
VoV (Ex-Member)
Newbie
Messaggi: 7
Iscritto: 29/11/2008
|
Un attimo ... il valore che inserisci prima e dopo, non e' detto che sia di una sola cifra ... dato che usi la lunghezza della stringa, questo puo' essere tra 1 e 3 cifre ... giusto? |
si è vero, non ci avevo pensato...per questo ho risolto facilmente mettendo delle limitazioni
Codice sorgente - presumibilmente C/C++ |
if (j > 11){
while(frase[pos]!='\0' && (pos < j)){
frase[pos] -= (j - 4);
pos++;}
|
se invece è minore di 11
Codice sorgente - presumibilmente C/C++ |
if (j <= 11){
while(frase[pos]!='\0' && (pos < j)){
frase[pos] -= (j - 2);
pos++;
}
|
@ingMark ci avevo pensato anche io però il problema sarebbe appunto l'input di stringhe contenenti numeri, anche per il fatto che spostando le lettere di N posizioni può capitare che una lettera venga sostituita con un numero che se successivamente viene eliminato rende impossibile decriptare la stringa
nessuno sa esattamente come funzioni strtok()? ho cercato su google e non ho trovato quasi nulla Ultima modifica effettuata da VoV il 08/06/2009 alle 16:59 |
|
()
Newbie
Messaggi:
Iscritto:
|
strtok all'inizio è un po ostica, o almeno anche io all'inizio ho riscontrato la tua stessa riluttanza ad usarla
in ogni caso devi definire dei limitatori per usarla ad esempio i caratteri speciali
Codice sorgente - presumibilmente C/C++ |
ad ogni simbolo che inserisci tra le virgolette (non sei obbligato a fare un define eh )
la strtok si fermerà e ti restituirà un puntatore.
la prima volta devi passarle la stringa su cui vuoi operare e i delimitatori, in questo modo:
Codice sorgente - presumibilmente Plain Text |
token = strtok(tua_stringa, DELIM);
|
token c'è la tua stringa, ma al posto del delimitatore ora c'è '\0', messo dalla strtok
le volte successive che la utilizzi sulla stessa stringa invece del nome, devi passare NULL, cosi:
Codice sorgente - presumibilmente Plain Text |
while(token != NULL)
token = strtok(NULL, DELIM); /*e tutto il resto che devi fare*/
|
token ovviamente lo puoi definire come definiresti una stringa^^
in effetti se tu separassi i numeri di inizio e fine dalla frase, non avresti limitazioni di sorta^^
esempio:
Codice sorgente - presumibilmente C# |
char tua_stringa[] = "111%stringa_di_prova%111\0" char token[MAX_STR]; token = strtok(tua_stringa, DELIM); /* ti restituisce "111\0" */ while (token != NULL) token = strtok(NULL, DELIM); /*la prima volta ti restituisce "stringa_di_prova\0" la seconda "111\0" la terza si ferma perchè token = NULL */
|
In ogni caso avresti limitazioni anche qua!
In c (non so in altri linguaggi) le stringhe sono stringhe compatte, ovvero una stringa è stringa fino al primo spazio che incontra (è come leggere con scanf("%s")).
Quindi non potresti inserire spazi! :P
Secondo me una volta definiti dei delimitatori ti conviene leggere tutto carattere per carattere Ultima modifica effettuata da il 08/06/2009 alle 17:30 |
|