[C++] probleme avec mes string

Résolu/Fermé
popy1970 Messages postés 3 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 12 juin 2007 - 9 juin 2007 à 18:26
mamiemando Messages postés 33453 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 janvier 2025 - 12 juin 2007 à 07:49
Bonjour j'ai un petit probleme avec mes string sous linux,

la compilation se passe tres bien sans erreur , mais par contre lorsque vient le temps d'executer le code suivant, chaque valeur de mes string change pour la derniere valeur assigner, mais ce n'est meme pas les meme string voici le code

std::string DBHost, DBName, DBUser, DBPass, DBType = "mysql";
int ParseDBAddr(const char *addr)
{
	int len = strlen(addr) + 1;
 
	char *specific = new char[len] ;
	char *hostinfo = new char[len];
	char *hostname = new char[len];
	char *auth = new char[len];
	char *dbtype = new char[len];
	char *dbname = new char[len];
	char *dbhost = new char[len];
	char *dbuser = new char[len];
	char *dbpass = new char[len];
 
	dbtype[0]=0;
	auth[0] = 0;
	specific[0]=0;
	hostinfo[0]=0;
	hostname[0]=0;
	dbname[0]=0;
	dbuser[0]=0;
	dbpass[0]=0;
	dbhost[0]=0;
 
	if(sscanf(addr,"%[^:]:%s", dbtype , specific) == 2)
	{
		switch (sscanf(specific, "//%[^/]/%s", hostinfo, dbname))
		{
			case 1: break;
			case 2:
				char *ch;
				if ((ch = strrchr(dbname, '/')))
					*ch = '\0';
					break;
			default: return 1;
		}
 
		switch (sscanf(hostinfo, "%[^@]@%s", auth, hostname))
		{
			case 1:
				strcpy(hostname, auth);
				break;
			case 2:
				sscanf(auth, "%[^:]:%s", dbuser, dbpass);
				break;
			default: break;
		}
 
		sscanf(hostname, "%[^:]:%d", dbhost, &DBPort);
	}
	if(dbtype[0])
		DBType = dbtype;
	if(dbname[0])
		DBName = dbname;
	if(dbuser[0])
		DBUser = dbuser;
	if(dbpass[0])
		DBPass = dbpass;
	if(dbhost[0])
		DBHost = dbhost;
 
	delete dbname;
	delete dbhost;
	delete dbuser;
	delete dbpass;
	delete dbtype;
	delete auth;
	delete specific;
	delete hostinfo;
	delete hostname;
 
	return 0;
}
 


a la fin TOUTES mes valeur sont egal a la valeur DBHost, sauf DBType ce qui n'est pas logique en soit, et je ne comprend vraiment pas pourquoi

ce code compilais et fonctionnais tres bien avec gcc 3.2, mais pas avec GCC 4 (il comppile sans erreur, mais ne fonctionne pas comme prevue)

6 réponses

FLYPKONE Messages postés 7 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 10 juin 2009
9 juin 2007 à 18:31
je pensais que tu faisai allusion aux string "caleçon " des filles
0
mamiemando Messages postés 33453 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 janvier 2025 7 812
10 juin 2007 à 01:18
Pourquoi tu n'utilises pas tout simplement des std::string et des find ?
#include <string>
#include <iostream>
#include <stdexcept>

int main(){
    const std::string str("tapir:zfgracv@host");
    const unsigned
        idx_sep_login_pass = str.find(':'),
        idx_sep_pass_host  = str.find('@');
    if(idx_sep_login_pass == std::string::npos
    || idx_sep_pass_host == std::string::npos){
        std::cerr << "invalid string: format login:pass@host" << std::endl;
        return 1;
    }
    const std::string
        login = str.substr(0,idx_sep_login_pass),
        pass  = str.substr(idx_sep_login_pass+1,idx_sep_pass_host-idx_sep_login_pass-1),
        host  = str.substr(idx_sep_pass_host+1);
    std::cout << "login = " << login << std::endl
        << "pass = " << pass << std::endl
        << "host = " << host << std::endl;
    if(!login.size()) throw std::runtime_error("empty login");
    if(!pass.size())  throw std::runtime_error("empty pass");
    if(!host.size())  throw std::runtime_error("empty host");
    return 0;
}

Bonne chance
0
popy1970 Messages postés 3 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 12 juin 2007
11 juin 2007 à 03:22
merci du coup de main, je commence a y arriver, voici ce que j'ai fait, presque toutes mes variable, reste comme il faut, mais ma variable DBName devient "" apres la fonction...
int GetDBaddr( const char* address, const char* namedb)
{

    const std::string str(address);
    const unsigned
        idx_sep_login_pass = str.find(':'),
        idx_sep_pass_host  = str.find('@');
    if(idx_sep_login_pass == std::string::npos
    || idx_sep_pass_host == std::string::npos){
       //
        return 1;
    }
    const std::string
        login = str.substr(0,idx_sep_login_pass),
        pass  = str.substr(idx_sep_login_pass+1,idx_sep_pass_host-idx_sep_login_pass-1),
        host  = str.substr(idx_sep_pass_host+1);
    
    if(!login.size()) throw std::runtime_error("empty login");
    if(!pass.size())  throw std::runtime_error("empty pass");
    if(!host.size())  throw std::runtime_error("empty host");
    DBUser = login;
    DBPass = pass;
    DBHost = host;
    DBName =namedb;
	return 0;

}
dans mon fonction parsedbaddress (telle que mentionner dans mon 1er message) j'ai ajouter ceci
	std::string address(hostinfo);
	std::string namedb(dbname);
   	GetDBaddr(address.c_str(), namedb.c_str());



je continuer a chercher, mais disons que ta piste de solution c'est averer tres bonner

merci
0
mamiemando Messages postés 33453 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 janvier 2025 7 812
12 juin 2007 à 00:39
Passe les en paramètre de la fonction
#include <string>
#include <iostream>
#include <stdexcept>

bool read_login_pass_host(
    const std::string & str,
    std::string & login,
    std::string & pass,
    std::string & host
){
    const unsigned
        idx_sep_login_pass = str.find(':'),
        idx_sep_pass_host  = str.find('@');
    if(idx_sep_login_pass == std::string::npos
    || idx_sep_pass_host == std::string::npos){
        return false;
    }
    login = str.substr(0,idx_sep_login_pass);
    pass  = str.substr(idx_sep_login_pass+1,idx_sep_pass_host-idx_sep_login_pass-1);
    host  = str.substr(idx_sep_pass_host+1);
    if(!login.size()) return false;
    if(!pass.size())  return false;
    if(!host.size())  return false;
    return true; // tout est ok :)
}


int main(){
    const std::string str("tapir:zfgracv@host");
    std::string login,pass,host;
    if(!read_login_pass_host(str,login,pass,host)){
        std::cerr << "chaine invalide: " << str << std::endl;
        return 1;
    }
    std::cout << "login = " << login << std::endl
              << "pass = "  << pass  << std::endl
              << "host = "  << host  << std::endl;
    return 0;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
popy1970 Messages postés 3 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 12 juin 2007
12 juin 2007 à 05:16
Merci beaucoups, avec ta piste de solution, j'ai reussi a regle mon petit probleme,
0
mamiemando Messages postés 33453 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 6 janvier 2025 7 812
12 juin 2007 à 07:49
Pas de soucis :)
0