OVH Cloud OVH Cloud

scanf() plante

21 réponses
Avatar
dark poulpo
bonjour,
jai un probleme sur l'instrcution suivante;
if (sscanf(line, "%[^:]:%d", proxyname,port) == 2) // mon but est de
recuperer le serveur et le port dans une ligne de ce type www.kks.col:80\r\n

mais avec les : ca crach, si je remplace [^:] par [^;] par exemeple, ca
plante plus. quelqun peut m'aider? merci

10 réponses

1 2 3
Avatar
Fabien LE LEZ
On Fri, 30 Jul 2004 02:44:48 +0200, "dark poulpo"
:

if (sscanf(line, "%[^:]:%d", proxyname,port) == 2) // mon but est de
recuperer le serveur et le port dans une ligne de ce type www.kks.col:80rn


Utilise un vrai moteur d'expression régulières|rationelles ("regular
expressions", je ne suis pas sûr de la traduction en français).
boost::regex <http://www.boost.org/libs/regex/doc/index.html>, par
exemple.

Ou PCRE <http://www.pcre.org/>, si tu préfères le C.


--
;-)

Avatar
drkm
"dark poulpo" writes:

jai un probleme sur l'instrcution suivante;
if (sscanf(line, "%[^:]:%d", proxyname,port) == 2) // mon but est de
recuperer le serveur et le port dans une ligne de ce type www.kks.col:80rn

mais avec les : ca crach, si je remplace [^:] par [^;] par exemeple, ca
plante plus. quelqun peut m'aider? merci


On dirait que tu essaies d'utiliser des expressions rationelles avec
`sscanf()'. Mais il n'y a pas de support des expressions rationelles
dans la bibliothèque C++ standard. Il existe plusieurs
implémentations, certaines en C++, beaucoup en C.

Tu peux notamment regarder du côté de Boost.Regex,
<URL:http://www.boost.org/>. Peut-être même as-tu la chance de
posséder une implémentation de std::tr1. Je ne sais pas s'il existe
déjà des implémentations de std::tr1::regexp, mais je pense qu'elle
est inspirée de la Boost.Regex de John Maddock.

Mais pour une telle chose, peut être ceci te suffit-il :

#include <iostream>
#include <sstream>
#include <string>
#include <utility>

std::pair< std::string , int >
decodeDomainAndPort( std::string const & input )
{
std::istringstream iss( input ) ;
std::string domain ;
int port ;

std::getline( iss , domain , ':' ) ;
iss >> port ;

return std::make_pair( domain , port ) ;
}

int main()
{
std::pair< std::string , int > decoded decodeDomainAndPort( "www.kks.col:80" ) ;

std::cout
<< "domain: ""
<< decoded.first
<< "", port: "
<< decoded.second
<< std::endl ;
}

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
drkm
Fabien LE LEZ writes:

On Fri, 30 Jul 2004 02:44:48 +0200, "dark poulpo"

expression régulières|rationelles ("regular
expressions", je ne suis pas sûr de la traduction en français)


Je pense que la traduction exacte, venant de la théorie des
langages, est « expressions rationelles ». Même si O'Reilly sort un
livre sur les « expressions régulières ». AMHA, ils savent que tout
le monde comprend la seconde, qui est répandue et proche de l'anglais,
mais pas la première ...

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Jean-Marc Bourguet
drkm writes:

Fabien LE LEZ writes:

On Fri, 30 Jul 2004 02:44:48 +0200, "dark poulpo"

expression régulières|rationelles ("regular
expressions", je ne suis pas sûr de la traduction en français)


Je pense que la traduction exacte, venant de la théorie des
langages, est « expressions rationelles ». Même si O'Reilly sort un
livre sur les « expressions régulières ». AMHA, ils savent que tout
le monde comprend la seconde, qui est répandue et proche de l'anglais,
mais pas la première ...


J'ai tendance a reserver « expressions rationelles » pour les
contextes ou la definition precise de la théorie des langages est
necessaire et a utiliser « expressions régulières » quand on veut
specifier simplement des ensembles de chaines en se foutant que
celles-ci soient ou non des expressions rationelles.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Marc Boyer
drkm wrote:
Fabien LE LEZ writes:
On Fri, 30 Jul 2004 02:44:48 +0200, "dark poulpo"
expression régulières|rationelles ("regular
expressions", je ne suis pas sûr de la traduction en français)


Je pense que la traduction exacte, venant de la théorie des
langages, est « expressions rationelles ». Même si O'Reilly sort un
livre sur les « expressions régulières ». AMHA, ils savent que tout
le monde comprend la seconde, qui est répandue et proche de l'anglais,
mais pas la première ...


Pour préciser encore plus, un langage rationnel est un langage
reconnaissable par un automate, un langage regulier un langage
engendré par une expression régulière (globalement un terme
d'une algèbre sans point fixe), si mes souvenirs sont bons.
On montre que les deux familles sont équivalentes, et qu'on
peut donc utiliser l'un pour l'autre.

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...


Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
J'ai tendance a reserver « expressions rationelles » pour les
contextes ou la definition precise de la théorie des langages est
necessaire et a utiliser « expressions régulières » quand on veut
specifier simplement des ensembles de chaines en se foutant que
celles-ci soient ou non des expressions rationelles.


Par pure curiosité, as-tu déjà manipulé un outil qui
permettait de traiter des expression régulière qui n'étaient
pas rationnelles ? (mais on va finir sur fr.comp.algo
ou fr.comp.divers si on continue)

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...

Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Jean-Marc Bourguet wrote:
J'ai tendance a reserver « expressions rationelles » pour les
contextes ou la definition precise de la théorie des langages est
necessaire et a utiliser « expressions régulières » quand on veut
specifier simplement des ensembles de chaines en se foutant que
celles-ci soient ou non des expressions rationelles.


Par pure curiosité, as-tu déjà manipulé un outil qui
permettait de traiter des expression régulière qui n'étaient
pas rationnelles ? (mais on va finir sur fr.comp.algo
ou fr.comp.divers si on continue)


Pour quelle definition d'expression reguliere? Les expressions
regulieres de perl ne sont pas verifiables par des automates a nombre
fini d'etats et ne sont pas specifiables par des grammaires de type 0.

Exemple d'une telle expression reguliere dans perl: /([0-9]+)1/

Je n'ai pas regarde celles de boost dans cet optique.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
Marc Boyer writes:
Par pure curiosité, as-tu déjà manipulé un outil qui
permettait de traiter des expression régulière qui n'étaient
pas rationnelles ? (mais on va finir sur fr.comp.algo
ou fr.comp.divers si on continue)


Pour quelle definition d'expression reguliere? Les expressions
regulieres de perl ne sont pas verifiables par des automates a nombre
fini d'etats et ne sont pas specifiables par des grammaires de type 0.

Exemple d'une telle expression reguliere dans perl: /([0-9]+)1/


OK, merci

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...


Avatar
Horst Kraemer
"dark poulpo" wrote:

bonjour,
jai un probleme sur l'instrcution suivante;
if (sscanf(line, "%[^:]:%d", proxyname,port) == 2) // mon but est de
recuperer le serveur et le port dans une ligne de ce type www.kks.col:80rn

mais avec les : ca crach, si je remplace [^:] par [^;] par exemeple, ca
plante plus. quelqun peut m'aider? merci



Ca plante probablement parce que 'port' ne passe pas l'adresse d'un
int mais une valeur...

#include <stdio.h>

int main()
{

char line[]="www.kks.col:80n";
char proxyname[100];
int port;

sscanf(line, "%[^:]:%d", proxyname,&port);

printf("%s:%d",proxyname,port);

return 0;
}


Ce programme donne le résultat attendu.


--
Horst

Avatar
drkm
Marc Boyer writes:

Pour préciser encore plus, un langage rationnel est un langage
reconnaissable par un automate, un langage regulier un langage
engendré par une expression régulière (globalement un terme
d'une algèbre sans point fixe), si mes souvenirs sont bons.
On montre que les deux familles sont équivalentes, et qu'on
peut donc utiliser l'un pour l'autre.


Dans cette nomanclature (mis à part, à la lumière de l'article de
Jean Marc, qu'une « expression régulière n'est pas toujours
rationnelle »), l'« expression rationnelle » serait la chaîne que l'on
utilise pour chercher une correspondance, et l'« expression
régulière » le texte sur lequel on cherche cette correspondance.
C'est bien cela ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

1 2 3