%userprofile% en language c ?
Résolu/Fermé
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
-
16 nov. 2008 à 16:34
baibounet29 Messages postés 379 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 24 octobre 2014 - 19 nov. 2008 à 21:13
baibounet29 Messages postés 379 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 24 octobre 2014 - 19 nov. 2008 à 21:13
22 réponses
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
16 nov. 2008 à 17:07
16 nov. 2008 à 17:07
hello
%USERPROFILE% est une variable d'envirennement, il faut récupérer sa valeur avec getenv et construire le chemin avec
char *p;
p = getenv ( "USERPROFILE" );
%USERPROFILE% est une variable d'envirennement, il faut récupérer sa valeur avec getenv et construire le chemin avec
char *p;
p = getenv ( "USERPROFILE" );
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
16 nov. 2008 à 17:38
16 nov. 2008 à 17:38
merci !
une repponse rapide avec un exemple ! que rever de mieu ! ! !
je test ca vant ce soir et je tient au courant si ji arrive ou pas!
une repponse rapide avec un exemple ! que rever de mieu ! ! !
je test ca vant ce soir et je tient au courant si ji arrive ou pas!
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
16 nov. 2008 à 18:33
16 nov. 2008 à 18:33
heu ... ji arrive pa !
jai bien verifier le chemin et ca marche printf ("%s", p); -> c:\users\baibounet29
mais je vois pas comment l'intergrer ds mkdir...
mkdir ("p\\documents\\test31") ne cree pas de dossier
et mkdir ("%s\\documents\\test31", p) ne marche pas (too many arguments)...
--
X200-21E ! ! !
T7500 ; 8700M GT 512MO ; HDD 7200t/min 16MO cache ; 4GO Ram GSKILL 4-4-4-12 ; Vista 64bit
jai bien verifier le chemin et ca marche printf ("%s", p); -> c:\users\baibounet29
mais je vois pas comment l'intergrer ds mkdir...
mkdir ("p\\documents\\test31") ne cree pas de dossier
et mkdir ("%s\\documents\\test31", p) ne marche pas (too many arguments)...
--
X200-21E ! ! !
T7500 ; 8700M GT 512MO ; HDD 7200t/min 16MO cache ; 4GO Ram GSKILL 4-4-4-12 ; Vista 64bit
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
16 nov. 2008 à 20:11
16 nov. 2008 à 20:11
Salut,
sprintf crée le formatage mais fout le bouzin dans une chaine au lieu de l'afficher à l'écran ;-)
sprintf crée le formatage mais fout le bouzin dans une chaine au lieu de l'afficher à l'écran ;-)
char bidule[100]; sprintf(bidule, "%s/suitechemin", getenv("username")); mkdir(bidule);
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
16 nov. 2008 à 20:09
16 nov. 2008 à 20:09
je pense que si jarrivai a modifier p (c:\users\baibounet29 ) pour qu'il devienne c:\\users\\baibounet29 ca marcherait
malheuresement ma methode habituelle de detection de caractere (if (p[i]=='\')) ne marche pas ...
enfin bon ... si vous pouviez maider a creer un prog en c permettant de creer un fichier TEST31 quelque soit lutilisateur dans %profiluser%\documents\
Merci
malheuresement ma methode habituelle de detection de caractere (if (p[i]=='\')) ne marche pas ...
enfin bon ... si vous pouviez maider a creer un prog en c permettant de creer un fichier TEST31 quelque soit lutilisateur dans %profiluser%\documents\
Merci
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
17 nov. 2008 à 09:37
17 nov. 2008 à 09:37
essaye avec (if (p[i]=='\\') ou (if (p[i]== 0x5c)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Il ne faut pas utiliser USERPROFILE, mais l'api Win32.
demander sur le newsgroup professionnel des apis win32 :
news://194.177.96.26/fr.comp.os.ms-windows.programmation
où cela a souvent été discuté (C, C++, etc)
demander sur le newsgroup professionnel des apis win32 :
news://194.177.96.26/fr.comp.os.ms-windows.programmation
où cela a souvent été discuté (C, C++, etc)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 nov. 2008 à 00:28
17 nov. 2008 à 00:28
Il ne faut pas utiliser USERPROFILE, mais l'api Win32.
Pourquoi? S'il veut porter son code sous linux, il a juste à adapter pour mettre HOMEDIR à la place de userprofile, alors que s'il utilise l'api win32 c'est un autre bordel, c'est moi qui te le dis...
Pourquoi? S'il veut porter son code sous linux, il a juste à adapter pour mettre HOMEDIR à la place de userprofile, alors que s'il utilise l'api win32 c'est un autre bordel, c'est moi qui te le dis...
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
17 nov. 2008 à 13:21
17 nov. 2008 à 13:21
Jai vraimentl'impression d'etre une cave..
#include <stdio.h>
#include <string.h>
#include <dir.h>
int main(){
char *p,*q;
int i, n, r=0;
p = getenv ( "USERPROFILE" );
for (i=0;i<50;i++){
n=i+r;
if (p[i]=!'\\')
q[n]=p[i];
else {
q[n]=p[i];
r=r+1;
q[n+1]='\\';}
}
printf ("finish-> %s", q);
return 0;
}
ca devrait me doner "finish-> C:\\Users\\Baibounet29"
nn ?
#include <stdio.h>
#include <string.h>
#include <dir.h>
int main(){
char *p,*q;
int i, n, r=0;
p = getenv ( "USERPROFILE" );
for (i=0;i<50;i++){
n=i+r;
if (p[i]=!'\\')
q[n]=p[i];
else {
q[n]=p[i];
r=r+1;
q[n+1]='\\';}
}
printf ("finish-> %s", q);
return 0;
}
ca devrait me doner "finish-> C:\\Users\\Baibounet29"
nn ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 nov. 2008 à 13:46
17 nov. 2008 à 13:46
Ceci devrait plutôt te retourner un segfault.
char *p = getenv ( "USERPROFILE" );
Pas le droit de modifier p.
Je te conseille donc de plutôt faire :
Même remarque pour q. Utilise plutôt char q[50]; //voir même plus que la taille de p puisqu'il va contenir des doubles backslashs au lieu de simple.
Cdlt
char *p = getenv ( "USERPROFILE" );
Pas le droit de modifier p.
Je te conseille donc de plutôt faire :
char p[50]; //50 ou plus, tu mets le nombre que tu veux. Si tu veux absolument contenir toute la chaîne quelque soit la taille, utilise l'allocation dynamique (malloc) strncpy=getenv("USERPROFILE",sizeof p);
Même remarque pour q. Utilise plutôt char q[50]; //voir même plus que la taille de p puisqu'il va contenir des doubles backslashs au lieu de simple.
Cdlt
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
17 nov. 2008 à 20:28
17 nov. 2008 à 20:28
jai essayer ce ke tu ma dit (enfin... je crois... si jme suis pa trompé!)
heuuuu jvai paraitre casse co..lle mais personne ne pourrais pas juste corriger mon truc ?
merci encor
heuuuu jvai paraitre casse co..lle mais personne ne pourrais pas juste corriger mon truc ?
merci encor
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 nov. 2008 à 20:32
17 nov. 2008 à 20:32
Poste voir ton code actuel entre les balises code!
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 nov. 2008 à 20:59
17 nov. 2008 à 20:59
Alors reprenons:
D'abord, q ne pointe sur rien, donc ça va crasher. Ensuite c'est != et pas =! et enfin je ne comprends pas ce que tu veux faire :-)
#include <stdio.h> #include <string.h> #include <dir.h> int main() { char *p,*q; int i, n, r=0; p = getenv ( "USERPROFILE" ); for (i=0;i<50;i++){ n=i+r; if (p[i]=!'\\') q[n]=p[i]; else { q[n]=p[i]; r=r+1; q[n+1]='\\';} } printf ("finish-> %s", q); return 0; }
D'abord, q ne pointe sur rien, donc ça va crasher. Ensuite c'est != et pas =! et enfin je ne comprends pas ce que tu veux faire :-)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 nov. 2008 à 21:04
17 nov. 2008 à 21:04
Si kilian apporte ses corrections, je le fais aussi :d ^^.
#include <stdio.h> #include <string.h> #include <dir.h> #include <string.h> int main() { char p[51],q[51]; int i, n, r=0; strncpy(p,getenv ( "USERPROFILE" ),sizeof p); p[sizeof(p) -1]='\0'; for (i=0;i<50;i++){ n=i+r; if (p[i]!='\\') q[n]=p[i]; else { q[n]=p[i]; r=r+1; q[n+1]='\\';} } printf ("finish-> %s", q); return 0; }
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
17 nov. 2008 à 21:07
17 nov. 2008 à 21:07
merci a kilian et a fiddy ! !(aussi aux autre mais un peu moin !)
fiddy ton code marche nikel ! (mais je comprend pas pourkoi il y a 2 string.h ! lol!)
fiddy ton code marche nikel ! (mais je comprend pas pourkoi il y a 2 string.h ! lol!)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 nov. 2008 à 21:09
17 nov. 2008 à 21:09
mais je comprend pas pourkoi il y a 2 string.h
On sait jamais! ;-)
Surtout en ce moment avec la crise, vaut mieux manquer de rien....
On sait jamais! ;-)
Surtout en ce moment avec la crise, vaut mieux manquer de rien....
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 nov. 2008 à 21:14
17 nov. 2008 à 21:14
Oui c'est la crise.
En plus, gcc est un peu vieux, donc il faut répéter ;)
En plus, gcc est un peu vieux, donc il faut répéter ;)
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
17 nov. 2008 à 21:16
17 nov. 2008 à 21:16
Tout à fait...!
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
17 nov. 2008 à 22:35
17 nov. 2008 à 22:35
maintenant que q=c:\\user\\baibounet29
en supposant que le dossier c:\user\baibounet29\test31 existe, est ce qu'on pourrais faire un truc du genre:
char profil[255]
scanf ("%s" , &profil);
mkdir ("%s\\test31\\%s", q, profil)
afin de creer un dossier c:\users\baibounet29\test31\toto (en supposant que lutilisateur ai taper toto !)
merci
en supposant que le dossier c:\user\baibounet29\test31 existe, est ce qu'on pourrais faire un truc du genre:
char profil[255]
scanf ("%s" , &profil);
mkdir ("%s\\test31\\%s", q, profil)
afin de creer un dossier c:\users\baibounet29\test31\toto (en supposant que lutilisateur ai taper toto !)
merci
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 nov. 2008 à 22:48
17 nov. 2008 à 22:48
Re,
Cdlt
char profil[255]; char newChaine[512]; fgets(profil,sizeof profil, stdin); sprintf(profil,"%s\\test31\\%s",q,profil); mkdir(profil);
Cdlt
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
17 nov. 2008 à 22:54
17 nov. 2008 à 22:54
merci !
mais newchaine sert a quoi ? elle est a utilisee
mais newchaine sert a quoi ? elle est a utilisee
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 nov. 2008 à 23:08
17 nov. 2008 à 23:08
Lol. Il sert à rien. Au début, j'étais parti autrement et j'avais besoin d'une autre variable. Mais j'ai oublié d'effacer ^^.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
17 nov. 2008 à 23:39
17 nov. 2008 à 23:39
Garde là!! On ne sait jamais...
Les temps sont durs tu sais....
Les temps sont durs tu sais....
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
17 nov. 2008 à 23:53
17 nov. 2008 à 23:53
oui et tu pourra recuperer la bibli string.h de talleur en meme temp ! !
heu .. en fait ... desoler mais ca marche pô.... aucun dossier creer dans test31..
heu .. en fait ... desoler mais ca marche pô.... aucun dossier creer dans test31..
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 nov. 2008 à 23:58
17 nov. 2008 à 23:58
Fait voir un printf(profil) pour voir (après le sprintf).
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
19 nov. 2008 à 18:38
19 nov. 2008 à 18:38
jai fait un printf et je voyais pas de soucis apparent ..
en fait le pb de : fgets(profil,sizeof profil, stdin); est qu'il prend en compte le retour a la ligne ...
je l'ai juste donc remplacer par un simple scanf !
Merci
en fait le pb de : fgets(profil,sizeof profil, stdin); est qu'il prend en compte le retour a la ligne ...
je l'ai juste donc remplacer par un simple scanf !
Merci
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
19 nov. 2008 à 19:00
19 nov. 2008 à 19:00
Si tu utilises ton scanf, n'oublie pas de spécifier la taille quand même sinon, ça peut faire du dégât ;)
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
19 nov. 2008 à 19:20
19 nov. 2008 à 19:20
oui c bon jai regler le probleme de la taille !
jai un autre petit probleme. jarrive a creer a fichier texte avec ce code .
scanf ("%s" , &profil);
sprintf(profil2,"%s",profil);
sprintf((char *) &profil,"active.txt");
f = fopen(profil,"w");
fprintf(f,"%s",profil2);
mais il se creer dans le dossier où se trouve mon programme. vous noriez pas une idee pour le creer, ou tout du moin le copier, dans un autre dossier (le dossier que vous m'avez deja aider a creer !^^) .
(Jai lu qu'il nexiste pas de fonction en c pour copier un fichier).
merci
jai un autre petit probleme. jarrive a creer a fichier texte avec ce code .
scanf ("%s" , &profil);
sprintf(profil2,"%s",profil);
sprintf((char *) &profil,"active.txt");
f = fopen(profil,"w");
fprintf(f,"%s",profil2);
mais il se creer dans le dossier où se trouve mon programme. vous noriez pas une idee pour le creer, ou tout du moin le copier, dans un autre dossier (le dossier que vous m'avez deja aider a creer !^^) .
(Jai lu qu'il nexiste pas de fonction en c pour copier un fichier).
merci
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
19 nov. 2008 à 19:57
19 nov. 2008 à 19:57
en faite ca marrange que le fichier se crée dans le dossier du programme !
comment je pourrais faire pour le copier dans mon dossier test31\"profil" quelquesoit le dossier où se trouve le fichier source?
comment je pourrais faire pour le copier dans mon dossier test31\"profil" quelquesoit le dossier où se trouve le fichier source?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
19 nov. 2008 à 20:20
19 nov. 2008 à 20:20
scanf ("%s" , &profil); N'oublie pas qu'il ne faut pas mettre l'esperluette (&) pour les chaînes de caractères ;)
Sinon, non tu n'as toujours pas réglé le problème de la taille. Dans ta fonction scanf, il n'y a pas la présence de la taille.
Sinon, pour ouvrir un répertoire, et tout, ce n'est pas du C pur, mais cela dépend de ton OS. Donc, faudrait voir de ce côté. Tu utilises quel OS ?
Cdlt
Sinon, non tu n'as toujours pas réglé le problème de la taille. Dans ta fonction scanf, il n'y a pas la présence de la taille.
Sinon, pour ouvrir un répertoire, et tout, ce n'est pas du C pur, mais cela dépend de ton OS. Donc, faudrait voir de ce côté. Tu utilises quel OS ?
Cdlt
baibounet29
Messages postés
379
Date d'inscription
mercredi 17 janvier 2007
Statut
Membre
Dernière intervention
24 octobre 2014
53
19 nov. 2008 à 20:32
19 nov. 2008 à 20:32
le pb le la taille n'en ai pas un dans cette partie ! ! ! ^^
la je suis sous vista 64 (comme ecrit sur mon petit profil ci dessous ! ! !), tu ve dire que ca ne marchera pas pareil sous xp que sous vista (le prog ne tournera que sur des windobe de toute facon).
la je suis sous vista 64 (comme ecrit sur mon petit profil ci dessous ! ! !), tu ve dire que ca ne marchera pas pareil sous xp que sous vista (le prog ne tournera que sur des windobe de toute facon).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
19 nov. 2008 à 20:50
19 nov. 2008 à 20:50
le pb le la taille n'en ai pas un dans cette partie ! ! ! ^^
Ben, si. A partir du moment que tu utilises scanf comme tu l'as fait (sans indication de la taille). Tu autorises l'utilisateur à écrire une chaîne de la longueur qu'il veut, et comme il n'y a pas de contrôle de la taille, il pourra déborder et écrire dans la pile. Ce qui peut soit provoquer un crash, soit déclencher un code avec les droits du logiciel (dangereux si en administrateur). Enfin, c'est ton programme, c'est toi qui décide ;)
la je suis sous vista 64
Eh bien, je peux pas t'aider ^^. Faut regarder la doc sur google, ou attendre quelqu'un qui connaisse le développement sur cette plate-forme ;).
Bonne chance
Ben, si. A partir du moment que tu utilises scanf comme tu l'as fait (sans indication de la taille). Tu autorises l'utilisateur à écrire une chaîne de la longueur qu'il veut, et comme il n'y a pas de contrôle de la taille, il pourra déborder et écrire dans la pile. Ce qui peut soit provoquer un crash, soit déclencher un code avec les droits du logiciel (dangereux si en administrateur). Enfin, c'est ton programme, c'est toi qui décide ;)
la je suis sous vista 64
Eh bien, je peux pas t'aider ^^. Faut regarder la doc sur google, ou attendre quelqu'un qui connaisse le développement sur cette plate-forme ;).
Bonne chance