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
Jean-Marc Bourguet
drkm writes:

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 ?


Non, ce que Marc ecrit est plutot:
- un langage rationnel est un langage reconnaissable par un
automate a nombre fini d'etats
- un langage regulier est un langage dont la grammaire est
reguliere (alias grammaire de type 0)
Oh, il se trouve que les deux sont identiques (les expressions
regulieres sont alors une maniere plus compacte de donner une
grammaire reguliere).

Mon usage est different, j'utilise "expression rationnelle" dans les
contextes où il est important que le langage soit definit par une
grammaire reguliere et "expression reguliere" dans les autres
contextes où on peut utiliser des syntaxes proches de celles utilisees
dans les expressions rationnelles pour definir des langages qui non
definissables par des grammaires regulieres (dans l'exemple que je
donnais avec perl, une grammaire de type 1 -- alias libre de contexte
-- ne suffit d'ailleurs pas, il faut au moins une grammaire de van
Wijgarden).

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:
Mon usage est different, j'utilise "expression rationnelle" dans les
contextes où il est important que le langage soit definit par une
grammaire reguliere et "expression reguliere" dans les autres
contextes où on peut utiliser des syntaxes proches de celles utilisees
dans les expressions rationnelles pour definir des langages qui non
definissables par des grammaires regulieres


Ce qui paraît l'usage le plus raisonnable.
En fait, le limitant à un sous-ensemble de sed/grep/awk,
je n'avais jamais vu d'expression régulière non rationnelle,
mais grace à toi et à perl, j'en ai vue une ;-)

Donc, expressions régulières...

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
kanze
Marc Boyer wrote in message news:<ceddrr$h4e$...
Jean-Marc Bourguet wrote:
Mon usage est different, j'utilise "expression rationnelle" dans les
contextes où il est important que le langage soit definit par une
grammaire reguliere et "expression reguliere" dans les autres
contextes où on peut utiliser des syntaxes proches de celles utilisees
dans les expressions rationnelles pour definir des langages qui non
definissables par des grammaires regulieres


Ce qui paraît l'usage le plus raisonnable.
En fait, le limitant à un sous-ensemble de sed/grep/awk,
je n'avais jamais vu d'expression régulière non rationnelle,
mais grace à toi et à perl, j'en ai vue une ;-)


Strictement parlant, je ne crois pas que sed/grep/awk sont
des expressions rationnelles, au sens mathematique du mot.
Sed, au moins, permet les (...), par exemple, et il me
semble qu'il y avait des exceptions ou des extensions en
grep et awk.

Pour une implementation rigueureuse des expressions rationnelles,
tu peux regarder a ma site, GB_RegExpr. Mais je te signale
d'avance que tu vas trouver qu'il manque des choses par rapport
a des expressions regulieres que tu connais de sed et al.
(En revanche, il peut etre tres, tres rapide, quand la quantite
de texte a chercher est importante. Precisement parce qu'il
construit un automat fini.)

Donc, expressions régulières...


Tout a fait. Moi aussi, j'aime la distinction de Jean-Marc.
Ca donne une precision supplementaire qui n'existe pas en
anglais.

--
James Kanze


Avatar
Gabriel Dos Reis
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 ».

L'expression bénie, en France, est « expression rationnelle. »

[ Un jour, quelqu'un m'a raconté une obscure histoire comme quoi
« rationnelle » aurait un quelconque rapport avec les vraies fonctions
rationelles en math :

1/(1 - x) = 1 + x + x² + ... = x*
]

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

[ Un jour, quelqu'un m'a raconté une obscure histoire comme quoi
« rationnelle » aurait un quelconque rapport avec les vraies fonctions
rationelles en math :

1/(1 - x) = 1 + x + x² + ... = x*
]


J'ai entendu la même chose, mais je n'ai pu avoir de détails
ni en trouver. Aurais-tu une référence?

(Mes références sont toutes en anglais...)

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
Jean-Marc Bourguet
writes:

Marc Boyer wrote in message news:<ceddrr$h4e$...
Jean-Marc Bourguet wrote:
Mon usage est different, j'utilise "expression rationnelle" dans les
contextes où il est important que le langage soit definit par une
grammaire reguliere et "expression reguliere" dans les autres
contextes où on peut utiliser des syntaxes proches de celles utilisees
dans les expressions rationnelles pour definir des langages qui non
definissables par des grammaires regulieres


Ce qui paraît l'usage le plus raisonnable.
En fait, le limitant à un sous-ensemble de sed/grep/awk,
je n'avais jamais vu d'expression régulière non rationnelle,
mais grace à toi et à perl, j'en ai vue une ;-)


Strictement parlant, je ne crois pas que sed/grep/awk sont
des expressions rationnelles, au sens mathematique du mot.


Je le pense (au moins dans les versions POSIX, il y a
peut-être des versions avec des extensions).

Sed, au moins, permet les (...),


Mais 1 n'est autorisé que dans la partie remplacement. Et
c'est dans la partie motif que ça pose un problème.

par exemple, et il me semble qu'il y avait des exceptions
ou des extensions en grep et awk.


grep donne le choix entre deux syntaxes, mais si j'ai bonne
mémoire avec la même puissance.

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
dark poulpo
lollllll
merci a toi pour ton message,, c vrai que j'ai pas du faire attention a
donner l'adresse, car c'est passé à la compile, et quand il est 2h du mat, c
dur de refleichir. merci pour ta reponse simple, et precise. et merci a vous
autres pour avoir si bien repondu :-p


--
*************************
le bureau 3D pour windows
http://www.syndesk3d.fr.st
*************************
"Horst Kraemer" a écrit dans le message news:

"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
Jean-Marc Bourguet writes:

grep donne le choix entre deux syntaxes, mais si j'ai bonne
mémoire avec la même puissance.


Si je me souviens bien, il s'agit juste de certains caractères
spéciaux, comme '(', ')' ou '?', qui sont interprétés en tant que tel
en mode étendu, et en tant que caractères normaux en mode normal. Il
suffit en mode normal de les échapper par '' pour qu'ils retrouvent
leur status de caractères spéciaux.

Les deux syntaxes sont donc bien équivalentes. Mais je n'ai jamais
vraiement compris les raisons qui ont poussé à cet état de fait.
J'imagine qu'il s'agit du poids historique.

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

Avatar
drkm
Horst Kraemer writes:

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


C'est vraiment du C++ ?

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

Avatar
Horst Kraemer
On Sun, 01 Aug 2004 20:27:32 +0200, drkm
wrote:

Horst Kraemer writes:

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


C'est vraiment du C++ ?


Pardon.

#include <cstdio>

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

Ai-je mal compris qqch ?

Horst


1 2 3