Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23

    [C++] confronto vector e array di caratteri

    devo scrivere un'applicazione in cui un file di testo viene letto e memorizzato in un vector di stringhe
    codice:
    vector<string> text;
    dopo di che devo confrontare ogni carattere del testo caricato dal file con un array di char dal contenuto predefinito
    codice:
    char ARRAY[21] = {... ... ...}
    per cui avevo pensato ad una cosa del genere
    codice:
    for(int i = 0; i < text.size(); i++){
                   for(int j = 0; j < 21; j++){
                           if(text[i] == ARRAY[j])
                           index_t[i] = j;
                   }        
           }
    in fase di compilazione mi compare il seguente errore:
    no match for 'operator==' in '(((std::vector<std::string, std::allocator<std::string> >*)
    come posso risolverlo?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    if(text[i][j] == ARRAY[j])
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    perchè il doppio indice?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il primo per identificare un elemento del vettore, l'altro per il carattere dell'elemento scelto
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    mi spiego meglio per cercare di essere più chiaro. devo confrontare ogni carattere di ogni stringa contenuta in text (vector<string>) con l'array di caratteri ARRAY. se il confronto è positivo, associo ad una variabile temporanea 'index' il valore dell'indice corrispondente a quella lettera.
    per esempio: se una lettera di una stringa di text è R, il valore di index deve essere 15 (index = 15) poichè ARRAY[15] = 'R'.
    come posso iterare il tutto in modo da controllare ogni carattere di ogni stringa di text?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Come hai fatto con la correzione che ti ho suggerito ... ma devi spiegare a cosa ti serve index_t ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    sinceramente non ho provato ancora perchè nel frattempo abbiamo analizzato un'altra strada. comunque per rendere forse il tutto ancora più chiaro, ti invio il codice completo cosi si capisce meglio il tutto. l'applicazione implementa l'algoritmo di vigenere utilizzando l'alfabeto italiano: legge quindi un file di testo e carattere per carattere effettua la cifratura. le lettere cifrate verranno scritte su un altro file di testo. non potendo implementare l'algoritmo nel modo classico perchè in questo caso l'alfabeto è quello italiano, ho pensato di fare in questo modo: ho creato un array ALPH con tutti i caratteri dell'alfabeto italiano
    codice:
    char ALPH[21] = {'A','B','C','D','E','F','G','H','I','L','M','N','O','P','Q','R','S','T','U','V','Z'};
    dopo di che cerco la corrispondenza della lettera della chiave e della corrispondente lettera da cifrare in ALPH in modo da ottenere gli indici, in caso affermativo. Dopo di che calcolo lettera per lettera la cifratura. per esempio:
    CHIAVE: ROBERTO
    TESTO: PROVA
    codice:
    key[0] = R = ALPH[15] --->index_key = 15;
    text[0] = P = ALPH[13] --->index_text = 13;
    letteracodificata[0] = ALPH[(15+13)%21] = ALPH[7] = H
    il codice completo è:
    codice:
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    class Vigenere
    {
    public:
        string key;
        vector<string> text;
               
        Vigenere(string str){
           key = str;
           key = StringToUpper(key);
           if(!key.empty()){
               key = EraseChar(key);
           }
                                                                          
           return;
        }
        
        string StringToUpper(string convstr){
           for(int i = 0; i < convstr.length(); i++){
                   convstr[i] = toupper(convstr[i]);
                   }
           return convstr;
        }
        
        //load the content of a file into t
        void Vigenere::LoadText(string filename){
               ifstream f; 
               string line;
                      
               f.open(filename.c_str()); 
               if(!f.is_open()){
                    cout << "Error opening file: " << filename << " !" << endl;
                    return;
               }
               
               while(getline(f,line)){
                    line = StringToUpper(line);
                    if(!line.empty()){
                       line = EraseChar(line);
                       text.push_back(line);
                    }               
               }
              
              f.close();
        }
        
        //deletes all characters not in ALPH
        string EraseChar(string str){
           char ALPH[21] = {'A','B','C','D','E','F','G','H','I','L','M','N','O','P','Q','R','S','T','U','V','Z'};
           str = StringToUpper(str);
           for(int i = 0; i < str.length(); i++){
           bool inAlph = false;
                for(int j = 0; j < 21; j++){
                        if(str[i] == ALPH[j]){
                        inAlph = true;
                        break; // don't need to keep checking against the rest of ALPH
                        }
                }
                if (!inAlph) {
                str.erase(i,1);
                i--;
                }
           }
           return str;
        }
        
        void encode(string plaintext, string encoded_f){
           ofstream f; 
           char ALPH[21] = {'A','B','C','D','E','F','G','H','I','L','M','N','O','P','Q','R','S','T','U','V','Z'};
           
           TextErase();
           LoadText(plaintext); 
                  
           f.open(encoded_f.c_str());
           if(!f.is_open()){
               cout << "Error creating file: " << encoded_f << " !" << endl;
               return;
           }
           
           int index_k[key.length()];  //key indexs array           
           for(int i = 0; i < key.length(); i++){
                   for(int j = 0; j < 21; j++){
                           if(key[i] == ALPH[j])
                           index_k[i] = j;
                   }
           }          
    
           size_t* index_t = new size_t[text.size()]; //text indexs
           for (size_t i = 0; i < text.size(); ++i){
               size_t pos = text[i].find_first_of(ALPH);
               
               if (pos != std::string::npos){
                  index_t[i] = pos;
               }
               
               char ch = ALPH[(index_k[i%key.length()] + index_t[i])%21];
               f << ch;
           }
           f << "\n";
           f.close();
           return;
        }              
        
        void TextErase(){
           text.clear(); 
        }
    };
    
    int main()
    {
        string key, encoded, plaintext, decoded;
        cout << "Key: ";
        cin >> key;
        
        Vigenere cipher(key);
        
        cout << "Input file: ";
        cin >> plaintext;
        cout << "Output file: ";
        cin >> encoded;
        cipher.encode(plaintext,encoded);
                                             
    }
    aprendo un file con tre righe di testo, mi restituisce un file con solo tre lettere. come posso risolvere? ormai credo di non riuscire più nemmeno a pensare, sono incollato qui da più di 5 ore

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    sono ritornato sull'idea che mi hai dato del doppio indice per scorrere il vector text, modificando leggermente quanto mi avevi suggerito. ti posto il codice completo, la parte riguardante il confronto è nella funzione encode
    codice:
    //vigenere algorithm with Italian alphabet
    
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string.h>
    
    using namespace std;
    
    class Vigenere
    {
    public:
        string key;
        vector<string> text;
               
        Vigenere(string str){
           key = str;
           key = StringToUpper(key);
           if(!key.empty()){
               key = EraseChar(key);
           }
                                                                          
           return;
        }
        
        //converts every letter to uppercase
        string StringToUpper(string convstr){
           for(int i = 0; i < convstr.length(); i++){
                   convstr[i] = toupper(convstr[i]);
                   }
           return convstr;
        }
        
        //load the content of a file into text
        void Vigenere::LoadText(string filename){
               ifstream f; 
               string line;
                      
               f.open(filename.c_str()); 
               if(!f.is_open()){
                    cout << "Error opening file: " << filename << " !" << endl;
                    return;
               }
               
               while(getline(f,line)){
                    line = StringToUpper(line);
                    if(!line.empty()){
                       line = EraseChar(line);
                       text.push_back(line);
                    }               
               }
              
              f.close();
        }
        
        //deletes all characters not in ALPH
        string EraseChar(string str){
           char ALPH[21] = {'A','B','C','D','E','F','G','H','I','L','M','N','O','P','Q','R','S','T','U','V','Z'};
           str = StringToUpper(str);
           for(int i = 0; i < str.length(); i++){
           bool inAlph = false;
                for(int j = 0; j < 21; j++){
                        if(str[i] == ALPH[j]){
                        inAlph = true;
                        break; // don't need to keep checking against the rest of ALPH
                        }
                }
                if (!inAlph) {
                str.erase(i,1);
                i--;
                }
           }
           return str;
        }
        
        void encode(string plaintext, string encoded_f){
           ofstream f; 
           char ALPH[21] = {'A','B','C','D','E','F','G','H','I','L','M','N','O','P','Q','R','S','T','U','V','Z'};
           
           TextErase();
           LoadText(plaintext); 
                  
           f.open(encoded_f.c_str());
           if(!f.is_open()){
               cout << "Error creating file: " << encoded_f << " !" << endl;
               return;
           }
        
        /****************************************************************************
        * each letter in ALPH is associated with an index, so A-->0 B-->1 and so on.
        * now it checks every characters of every string of text in order to find
        * a correspondance. the same for the key.
        * for example:
        * key: ROBERT
        * text: PRINT
        * the first letter in text is P, which corrispond to ALPH[13], so index_t[0]=13
        * the first letter in key is R, which corrispond to ALPH[15], so index_k[0]=15
        * the first encoded letter is:
        * ALPH[(index_t[0]+index_k[0])%21] = ALPH[7] = H
        ****************************************************************************/      
           
           int passwdcnt = 0;
           int* index_t = new int[text.size()];
           int* index_k = new int[key.length()];
           
           for(int i = 0; i < text.size(); i++){
               for(int j = 0; j < text[i].size(); j++){
                   char* ptr_k;
                   char* ptr_t;
                   if(ptr_t = strchr(ALPH,text[i][j])){
                          index_t[j] = ptr_t - ALPH;
                   }
                   if(ptr_k = strchr(ALPH,key[passwdcnt])){
                          index_k[j] = ptr_k - ALPH;
                   }
                   
                   char ch = ALPH[(index_t[j] + index_k[j])%21];
                   f << ch;
                   passwdcnt++;
                   if(passwdcnt > (key.length()-1))
                   passwdcnt = 0;
               }
               f << "\n";
           }
           f.close();
           delete [] index_t;
           delete [] index_k;
           return;
        }
                            
        void TextErase(){
           text.clear(); 
        }
    };
    
    int main()
    {
        string key, encoded, plaintext, decoded;
        cout << "Key: ";
        cin >> key;
        
        Vigenere cipher(key);
        
        cout << "Input file: ";
        cin >> plaintext;
        cout << "Output file: ";
        cin >> encoded;
        cipher.encode(plaintext,encoded);
                                             
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    la prima versione del codice mi restituisce soltanto alcune lettere contenute nel file e per giunta non crittografate. la seconda produce un file di testo vuoto e crasha durante l'esecuzione.
    please help

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.