Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77

    [C++]Comparazione Stringe in Array di Stringhe Dinamico

    Buonasera a tutti,
    ho un problema con questo programma,dato un array di stringhe dinamico preso da file devo chiaramente leggerlo e stamparlo e poi comparare le varie stringhe per vedere se sono uguali,nel caso non lo sono quali lettere hanno di differenza,esempio "ciao" e "cimaro" mi deve stampare MR.
    Il programma che ho fatto fin'ora � questo,la parte della lettura e stampa va bene tuttavia il problema � che il programma mi crasha non appena inserisco l'ultimo for del codice ossia quello in cui vengono comparate le stringhe.Ora io penso che il problema sia il fatto che non so accedere bene ad una struttura complessa come appunto l'array di stringhe,infatti ho dubbi anche per quanto riguarda la dichiarazione dell'array di stringhe.

    codice:
    #include <iostream>#include <cstring>
    #include <cstdlib>
    #include <fstream>
    
    
    using namespace std;
    
    
    
    
    int main()
    {
       fstream file;
       file.open ("dati.txt",ios::in);
       if (!file)
       cout << "Errore Apertura File";
    
    
       int n = 0;
       char contarighe[10];
    
    
    	while (!file.eof())
    	{
    	    file.getline (contarighe,10);
    	    n++;
    
    
    	}
    
    
       file.seekg(0);
       cout << "La lunghezza della lista e': " << n << "\n\n";
    
    
    
    
       string *vet = new string [n];
       string lettere;
    
    
      //Letture file
        for (int i=0;i<n;i++)
        file >> vet[i];
    
    
       //Stampa file
       for (int i=0;i<n;i++)
        cout << vet[i] << "\n";
    
    
    
    
      for (int i=0;i<n;i++)
        {
            if (vet[i] == vet[i+1])
             cout <<"uguali";
    
    
             else cout <<"diversi";
        }
    
    
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ci sono un paio di preblemi:

    1.
    codice:
    for (int i=0;i<n;i++) {
        if (vet[i] == vet[i+1])
          cout <<"uguali";
        else cout <<"diversi";
     }
    Quando arrivi a i=n-1, vai a confrontare vet[i] con vet[n]. ma così vai fuori dall'array(i cui indici vanno da 0 a n-1)
    e ti va in crash il programma.

    2.
    codice:
    string *vet = new string [n];
    Se non ho capito male, vorresti fare un array di n puntatori a stringhe. Dovresti fare cosi:
    codice:
    string** vet = new string*[n]; // un puntatore a puntatori di string
    e poi nel leggere il file:

    codice:
    file.clear();
    file.seekg(0, ios::beg);
    for (int i=0;i<n;i++){
       vet[i] = new string(); // vet[i] è solo un puntatore, bisogna prima creare l'oggetto
       file >> *vet[i];
    }
    
    for (int i=0;i<n;i++)
        cout << *vet[i] << "\n";
    
    for (int i=0;i<n-1;i++){
       if (*vet[i] == *vet[i+1])
          cout <<"uguali";
       else cout <<"diversi";
    }
    Visto che hai dei puntatori, devi deferenziare il puntore (un saluto a MItaly )
    Ultima modifica di boots; 29-05-2016 a 18:15

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    hai ragione infatti modificando la condizione di terminazione ora va perfettamente. Quindi a questo punto mi chiedo perchè se come dici tu la dichiarazione dell'array di stringhe non è esatta,il programma va comunque? ho provato anche ad aggiungere nel codice due cout per dire quali stringhe sono uguali e diverse verificando ulteriormente che tutto vada liscio e infatti così è.Ah come faccio ad evitare ripetizioni nelle comparazioni?

    codice:
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <fstream>
    
    
    using namespace std;
    
    
    int main()
    {
       fstream file;
       file.open ("dati.txt",ios::in);
       if (!file)
       cout << "Errore Apertura File";
    
    
       int n = 0;
       char contarighe[10];
    
    
    	while (!file.eof())
    	{
    	    file.getline (contarighe,10);
    	    n++;
    
    
    	}
    
    
       file.seekg(0);
       cout << "La lunghezza della lista e': " << n << "\n\n";
    
    
    
    
    
    
    
    
       string *vet = new string [n];
    
    
    
    
    
    
      //Letture file
        for (int i=0;i<n;i++)
        file >> vet[i];
    
    
    
    
    
    
       //Stampa file
       for (int i=0;i<n;i++)
        cout << vet[i] << "\n";
    
    
    cout << "\n\n";
    for (int i=0;i<n;i++)
    {
        if(vet[i]==vet[n-i-1])
        {
        cout << "la stringa " << i << " e' uguale alla stringa " << n-i-1 << "\n\n";
        }
        else
        cout << "la stringa " << i << " e' diversa dalla stringa " << n-i-1 << "\n\n";
    }
    
    
    }

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Si...scusa avevo capito male
    E' corretto lo stesso. Hai un array di stringhe e non di puntatori. Cosa intendi per ripetizioni?

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    in pratica quando fa la comparazione mi esce: stringa 1 uguale a stringa 4 e poi successivamente esce stringa 4 uguali a stringa 1 ma questo è ovvio quindi vorrei eliminare questa ripetizione

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Più che altro, dovresti specificare come andrebbero confrontate le stringhe. Così credo che ti basti ciclare da 0 a n/2

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    oppure potrei mettere al posto di vet[n-i-1] rimettere come prime vet[i+1] mettendo un ulteriore if (i+1== n) break; e uscire dal ciclo prima che crashi tutto?

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    che sarebbe come fare

    for (int i=0;i<n-1;i++)

    Cmq, non ho capito come vuoi confrontare le stringhe. Cosi confronti la i-esima con la successiva. Prima la 0 con n-1, la 1 con la n-2, etc

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    hai ragione :/ eh io inizialmente scrivendo vet[i]==vet[n-i-1] confronto la prima e l'ultima stringa e così via quindi confronta stringa[0] = giorgio e stringa[3] = giorgio ma alla fine del ciclo fa stringa[3] = giorgio e stringa[0] = giorgio seguendo l'andamento degli indici, perciò non so come uscirmene per evitare non tanto le ripetizioni di comparazioni perchè è chiaro che con il ciclo for le fa tutte ma che quantomeno non mi compaiano ovvietà come stringa 0 uguale a stringa 3 e stringa 3 uguale a stringa 0

  10. #10
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Se vuoi confrontare una stringa con TUTTE la altre fai così:

    codice:
    for(int i= 0; i < n-1; i++){
       for(int j= i+1 ; j < n; j++){
            if(vet[i] == vet[j]){
                  ....
            }
       }
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.