logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] probleme lorsque passer les argument à une fonction  (Lu 7311 fois)
yacine.ya
Profil challenge

Classement : 881/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 46


Voir le profil
« le: 05 Février 2011 à 20:56:37 »

**No Sms** tous le monde
je suis en train de developper une app sous linux (en C) qui accepte plusieurs parametres (nom du fichier par ex) mais si j'entre un parametre qui contient un * ou * tout court j'obtient n'importe quoi
puis j'ai fais une autre app qui affiche les parametres si je tape * elle affiche "12" ? comment je dois faire pour que l'app accepte  * et ? sans entrer \* et /?
et merci d'avance
Journalisée
courte66
Profil challenge

Classement : 133/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 6


Voir le profil
« #1 le: 05 Février 2011 à 21:35:18 »

comment je dois faire pour que l'app accepte  * et ? sans entrer \* et /?
et merci d'avance

Afin de lancer ton programme, ton shell interprete la ligne de commange que tu as ecrite et s'occupe d'executer ton programme.
Il interprete les expressions regulieres, c'est la raison pour laquelle une etoile n'est pas simplement consideree comme le caractere *. Si tu ne souhaites par qu'il l'interprete il faut l'echapper avec un backslash ou des simples quotes par exemple.

puis j'ai fais une autre app qui affiche les parametres si je tape * elle affiche "12" ?

L'etoile est interprétée par ton shell comme le nom de tous les élements (fichiers, répertoire, liens symboliques...) présent dans le répertoire courrant.
Tu dois donc avoir un fichier qui a pour nom 12.
« Dernière édition: 07 Février 2011 à 21:10:01 par courte66 » Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54254

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #2 le: 06 Février 2011 à 11:04:06 »

Il interprete les expressions regulieres,

Ce ne sont pas des expressions régulières :
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_08

Citation
Si tu ne souhaites par qu'il l'interprete il faut l'echapper avec une backquote ou des simples quotes par exemple.

Oui pour les simples quotes, mais pas le backquote (`), qui fait de la substitution de commande. On échappe avec un backslash (\).

Donc :
Code:
./coin '*bar*'
./coin \*foo
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
yacine.ya
Profil challenge

Classement : 881/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 46


Voir le profil
« #3 le: 06 Février 2011 à 12:38:26 »

Merci pour vos réponse,  mais ce que je faire c'est comme la commende find par ex on peut entrer find *.mp3 sans mettre \* ?
Journalisée
neroptik

Profil challenge

Classement : 99/54254

Membre Junior
**
Hors ligne Hors ligne
Messages: 74

good news everyone !


Voir le profil
« #4 le: 06 Février 2011 à 13:36:44 »

Lorsque tu fait find *.exe, ce n'est pas le programme qui se charge de trouver les fichiers correspondant au pattern *.exe mais ton shell.
Si tu veux pouvoir passer des * ou des ? sans que le shell vienne interferer il y a deux solutions:
\? et \*
ou bien tu utilise les quotes ou double quotes "*" et "?"
exemple:
Code:
#find "*.exe" (va chercher le fichier "*.exe")
alors que
Code:
#find *.exe
equivaut a
Code:
#find fichier1.exe fichier2.exe ficher3.exe (selon les fichiers presents dans le repertoire courant)

Cordialement,
neroptik
Journalisée

La Théorie c’est quand ça ne marche pas mais que l’on sait pourquoi.
La Pratique c’est quand ça marche mais qu’on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
_o_
Relecteur

Profil challenge

Classement : 42/54254

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #5 le: 06 Février 2011 à 13:39:26 »

ce que je faire c'est comme la commende find par ex on peut entrer find *.mp3 sans mettre \* ?

Essaie de te relire avant d'envoyer le message, tes phrases ne sont pas super claires.

Comme déjà expliqué, ton problème ne vient absolument pas de ton programme, mais du shell que tu utilises. Je me base sur bash, mais tu auras les mêmes soucis avec d'autres interpréteurs. Comme indiqué dans le lien de mon message précédent, avant que l'interpréteur ne lance la commande, il effectue différents traitements (substitution de commande, expansion des paramètres, etc). Dans le cas de bash, on peut désactiver le globbing (set -f ou set -o noglob) mais ça n'a aucun intérêt dans la vie courante.

Et surtout, find subit aussi l'expansion des paramètres, comme toutes les autres commandes. La preuve :
Code:
$ mkdir tmp
$ touch 1.mp3 tmp/2.mp3 tmp/1.mp3
$ find . ./1.mp3 -name *.mp3
./tmp/1.mp3
Bash fait l'expansion des paramètres, et transforme *.mp3 par 1.mp3 car ce fichier existe dans le répertoire courant. La commande lancée est donc find . -name 1.mp3, ce qui explique pourquoi il ne trouve pas tmp/2.mp3. Ça se voit très bien en activant le debug :

Citation
$ set -x
$ find . -name *.mp3
+ find . -name 1.mp3
./1.mp3
./tmp/1.mp3

En fait, la plupart du temps, tu as l'impression que le shell ne fait pas l'expansion, car le masque ne matche aucun fichier dans le répertoire courant. Par exemple :
Code:
$ rm 1.mp3
$ ls *.mp3
ls: ne peut accéder *.mp3: Aucun fichier ou dossier de ce type
$ set -x
$ find . -name *.mp3
+ find . -name '*.mp3'
./tmp/1.mp3
./tmp/2.mp3

Il est donc impératif de mettre le paramètre de name entre quotes, ce qui est bien précisé dans le manuel :
Citation
Don't forget to enclose the pattern in quotes in order to protect it from expansion by the shell.

#find "*.exe" (va chercher le fichier "*.exe")

Non. Cette commande va rechercher tous les fichiers matchant le masque "*.exe", nuance.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
neroptik

Profil challenge

Classement : 99/54254

Membre Junior
**
Hors ligne Hors ligne
Messages: 74

good news everyone !


Voir le profil
« #6 le: 07 Février 2011 à 23:30:32 »

#find "*.exe" (va chercher le fichier "*.exe")

Non. Cette commande va rechercher tous les fichiers matchant le masque "*.exe", nuance.

Humm... et que dit tu de ca ?

Code:
neroptik@neroptik-desktop:/var/www$ mkdir test
neroptik@neroptik-desktop:/var/www$ cd test
neroptik@neroptik-desktop:/var/www/test$ ls
neroptik@neroptik-desktop:/var/www/test$ touch "*.exe"
neroptik@neroptik-desktop:/var/www/test$ find "*.exe"
*.exe
neroptik@neroptik-desktop:/var/www/test$ ls
*.exe
neroptik@neroptik-desktop:/var/www/test$ touch toto.exe
neroptik@neroptik-desktop:/var/www/test$ find "*.exe"
*.exe
neroptik@neroptik-desktop:/var/www/test$ ls
*.exe  toto.exe
neroptik@neroptik-desktop:/var/www/test$ find *.exe
*.exe
toto.exe
neroptik@neroptik-desktop:/var/www/test$

Cela dit, on a peut etre pas le meme comportement...
Cordialement,
neroptik

EDIT: je viens de relire le man
Citation
Don't forget to enclose the pattern in quotes in order to protect it from expansion  by the shell.
n'est valable que pour l'argument que recoit l'option -name car celui-ci attend explicitement un pattern.
« Dernière édition: 07 Février 2011 à 23:35:12 par neroptik » Journalisée

La Théorie c’est quand ça ne marche pas mais que l’on sait pourquoi.
La Pratique c’est quand ça marche mais qu’on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
yacine.ya
Profil challenge

Classement : 881/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 46


Voir le profil
« #7 le: 08 Février 2011 à 11:57:22 »

Merci pour vos réponse, c bon ça marche il faut obligatoirement mettre \* ou "*"
Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54254

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #8 le: 08 Février 2011 à 18:59:03 »

EDIT: je viens de relire le man
Citation
Don't forget to enclose the pattern in quotes in order to protect it from expansion  by the shell.
n'est valable que pour l'argument que recoit l'option -name car celui-ci attend explicitement un pattern.

Toutes mes confuses, j'ai tellement l'habitude de voir un -name que j'ai automatiquement supposé que c'était le cas ici.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
Pages: [1]
  Imprimer  
 
Aller à: