Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - eliminare parte di una stringa
Forum - C/C++ - eliminare parte di una stringa

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
VoV (Ex-Member)
Newbie


Messaggi: 7
Iscritto: 29/11/2008

Segnala al moderatore
Postato alle 20:02
Domenica, 07/06/2009
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++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. void crypt();
  6. void decrypt();
  7.  
  8. int main()
  9. {
  10.     int scelta;
  11.  
  12.     printf("Crypter/Decrypter\n\n");
  13.     printf("Non inserire spazi tra le parole, ma inserisci _\n");
  14.     printf("Massimo 100 caratteri\n");
  15.     printf("\n1)Criptare \n2)Decriptare \n3)Esci\n");
  16.     printf("\nScegli un'operazione: ");
  17.     scanf("%d", &scelta);
  18.     switch (scelta){
  19.            case 1:
  20.                 crypt();
  21.            break;
  22.            case 2:
  23.                 decrypt();
  24.            break;
  25.            case 3:
  26.                 return 0;
  27.            break;
  28.            default:
  29.                    getchar();
  30.                    printf("\nNumero non valido\n");
  31.                    getchar();
  32.                    printf("\nPremere un tasto per uscire");
  33.            break;
  34.            }
  35. }
  36.  
  37. void crypt()
  38. {
  39.      int pos,j;
  40.      char frase[100];
  41.      
  42.      printf("\nTesto da criptare: ");
  43.      scanf("%99s",&frase);
  44.      strcat(frase,"\0");
  45.      pos = 0;
  46.      j = strlen(frase);
  47.      while(frase[pos]!='\0' && (pos < j )){
  48.            frase[pos] += j;
  49.            pos++;
  50.            }
  51.       printf("Testo criptato: %d%s%d\n\n",j , frase, j );
  52.       getchar();
  53.       printf("\nPremere un tasto per uscire");
  54.       getchar();
  55. }
  56.  
  57. void decrypt()
  58. {
  59.      int pos,j,x;
  60.      char frase[100];
  61.      
  62.      printf("\nTesto da decriptare: ");
  63.      scanf("%99s", &frase);
  64.      strcat(frase,"\0");
  65.      pos = 0;
  66.      j = strlen(frase);
  67.      while(frase[pos]!='\0' && (pos < j)){
  68.            frase[pos] -= (j - 2);
  69.            pos++;
  70.            }
  71.            x[frase] = 1;
  72.        printf("Testo decriptato: %s\n\n", x);
  73.        getchar();
  74.        printf("\nPremere un tasto per uscire");
  75.        getchar();          
  76. }


PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:13
Domenica, 07/06/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?


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 2:05
Lunedì, 08/06/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


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 12:00
Lunedì, 08/06/2009
se non mi sbaglio esiste una funzione substr che permette di estrarre una sottostringa da una stringa, potrebbe fare al caso tuo.

Ciao. :k:

Luigi


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 14:14
Lunedì, 08/06/2009
Testo quotato

Postato originariamente da gigisoft:

... funzione substr ...



In C ... ?

Mi sa che fai confusione con qualche altro linguaggio/libreria ...


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 14:39
Lunedì, 08/06/2009
Testo quotato

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... :d


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:29
Lunedì, 08/06/2009
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

  1. if(isalpha(carattere))
  2.     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

PM Quote
Avatar
VoV (Ex-Member)
Newbie


Messaggi: 7
Iscritto: 29/11/2008

Segnala al moderatore
Postato alle 16:51
Lunedì, 08/06/2009
Testo quotato

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++

  1. if (j > 11){
  2.            while(frase[pos]!='\0' && (pos < j)){
  3.              frase[pos] -= (j - 4);
  4.              pos++;}

se invece è minore di 11
Codice sorgente - presumibilmente C/C++

  1. if (j <= 11){
  2.                   while(frase[pos]!='\0' && (pos < j)){
  3.                   frase[pos] -= (j - 2);
  4.                   pos++;
  5.                   }



@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
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:18
Lunedì, 08/06/2009
strtok all'inizio è un po ostica, o almeno anche io all'inizio ho riscontrato la tua stessa riluttanza ad usarla:rotfl:

in ogni caso devi definire dei limitatori per usarla ad esempio i caratteri speciali

Codice sorgente - presumibilmente C/C++

  1. #define DELIM "%"



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

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

  1. while(token != NULL)
  2.    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^^:k:

esempio:

Codice sorgente - presumibilmente C#

  1. char tua_stringa[] = "111%stringa_di_prova%111\0"
  2. char token[MAX_STR];
  3.  
  4. token = strtok(tua_stringa, DELIM); /* ti restituisce "111\0" */
  5.  
  6. while (token != NULL)
  7.      token = strtok(NULL, DELIM); /*la prima volta ti restituisce "stringa_di_prova\0"
  8.                                    la seconda "111\0"
  9.                                    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
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo