{String Oriented}[C++] Confonto stringhe.

di Anonimizzato11617 il
10 risposte
Salve ragazzi, premetto che sono nuovo del forum, e che prima di registrarmi mi sono stati utili molti argomenti che ho trovato in questo forum come "visitatore".
Premetto anche che sono nuovo del linguaggio, provengo dal PHP, non sono un programmatore di professione, lo faccio per passione da diversi anni, nel tempo libero in quanto lavoro.

Ma ciancio alle bande, veniamo al dunque sono qui oggi per porvi il mio problema, sto creando una DLL che succesivamente injectero in un programma, il funzionamento è questo:

La DLL deve controllare se in una cartella prestabilita in una variabile path ci sono altri file oltre a quelli che ho dichiarato nell'array arry nella function controllo_array()


#include "main.h"
#include <dirent.h>
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

bool controllo_array(string parola, int grandezza)
{
	int i = 0;
	string arry[11][40] = { "mixed.dll","powered.txt","max.txt","perl.txt","juk.txt","liss.txt","readme.txt","nosh.txt","new.exe","cris.txt","voica.m4d" };
	while( i < grandezza){
	if (parola.c_str() == arry[i][40].c_str()){ return true; }else{ return false; } //controllo se il file esiste in arry
	i++;
	}
}

void controllo_file()
{
	DIR* d;
	string path;
	path = "new\\";
	d = opendir(path.c_str());
	if(d) 
	{
        dirent* f;
        while((f = readdir(d))){
			if(controllo_array(f->d_name,11) == false){
			remove(f->d_name); //rimuovo il file che ha trovato {intruso}
			printf("rimuovo %s \n",f->d_name); //scrivo sulla console che ha trovato un intruso
			}else{
			//non fare nulla
			}

		}

    }
}
Il problema è che anche se trova 2 stringhe uguali le da differenti quindi si trova sempre per eliminare tutti i file...

Grazie in anticipo per le eventuali dritte

10 Risposte

  • In che senso in seguito "inietterai la DLL" ?

    Che stai facendo ?
  • Un programma che legge i file diciamo che ha nella directory, non è che injectero, voglio far si che questa funzione sia in una DLL che sto creando appunto, perchè altrimenti l'untete potrebbe aggiungere file nella cartella.
  • parola.c_str() == arry[i][40].c_str()
    out of bounds. Stai leggendo fuori dall'array e in più stai confrontando due puntatori.
  • Stai mischiando C e C++ fra l'altro con una certa confusione di utilizzo delle stringhe e della logica della ricerca ...

    La funzione controllo_array dovrebbe essere
    
    bool controllo_array(string parola, int grandezza)
    {
    	int i = 0;
    	string arry[] = { "mixed.dll","powered.txt","max.txt","perl.txt","juk.txt","liss.txt","readme.txt","nosh.txt","new.exe","cris.txt","voica.m4d" };
       
    	while( i < grandezza)
    	{
    		if (parola == arry[i])
    			return true; 
    	
    		i++;
    	}
    
    	return false; 
    }
    
  • Avevo provato anche a fare così come dici tu, ma in ogni caso riporta sempre tutti i file della directory quasi i nomi non fossero uguali anche se in realtà lo sono...
  • Non capisco cosa dici.
  • La funzione ritorna sempre falsa..

    Questa è la funzione:
    bool controllo_array(string parola, int grandezza)
    {
       int i = 0;
       string arry[] = { "mixed.dll","powered.txt","max.txt","perl.txt","juk.txt","liss.txt","readme.txt","nosh.txt","new.exe","cris.txt","voica.m4d" };
       
       while( i < grandezza)
       {
          if (parola.c_str() == arry[i].c_str())
             return true;
       
          i++;
       }
    
       return false;
    }
    
    if(controllo_array(f->d_name,11) == false){
    //controllo_array() ritorna falso
    }else{
    //controllo_array() ritorna vero
    }
    Ora se io andassi a richiamare il controllo così:
    controllo_array("powered.txt",11);
    dove powered.txt è una stringa esistente nell'array, e 11 è la grandezza dell'array(immessa nella funzione per facilitarmi il while).
    Ora, come è possibile che la funzione mi ritorni falsa?
    Dovrebbe tornare vera in quanto la stringa è presente nell'array...
  • Il codice che stai usando per la funzione *non* è quello che ti ho suggerito.
  • Se stai lavorando in C++ usa le funzioni e le classi che C++ ti mette a disposizione. Non c'è bisogno di reinventare la ruota. E segui anche gli consigli che male non fanno.
    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    
    using namespace std;
    vector<string> arry; 
    
    bool controllo_array(const string & parola)
    {
    	return (std::find(arry.begin(),arry.end(),parola) !=  arry.end());
    }
    
    void controllo_file()
    {
    	if(controllo_array("new.exe"))
    	{
    		cout << "trovato";
    	}
    	else
    		cout << "non trovato";
    }
    
    int main()
    {
    	arry.push_back("mixed.dll");
    	arry.push_back("powered.txt");
    	arry.push_back("max.txt");
    	arry.push_back("perl.txt");
    	arry.push_back("juk.txt");
    	arry.push_back("liss.txt");
    	arry.push_back("readme.txt");
    	arry.push_back("nosh.txt");
    	arry.push_back("new.exe");
    	arry.push_back("cris.txt");
    	arry.push_back("voica.m4d");
    	controllo_file();
    }
    
  • Ora funziona, grazie Sky.
    Sarà fatto
Devi accedere o registrarti per scrivere nel forum
10 risposte