Manipulation de tableau de chaine

yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006 - 20 août 2004 à 10:33
 cs_AlexMAN - 26 août 2004 à 18:17
bonjours a tous
voila donc le code qui pose pb
un code plutot simple je debute

//---------------------------------------------------------------------------
#include <clx.h>
#include <stdio.h> //Pour manipulation sur les fichiers
#include <wininet.h> //Pour le connexion FTP
#pragma comment(lib, "wininet.lib")
//#pragma argsused

//---------------------------------------------------------------------------
//Dclaration des variables
FILE *commandes, *ftp; //Pointeur sur les fichiers
int i;
char *fichier[3] = {"winvnc4.exe", "wm_hooks.dll","logmessages.dll", "vnc.reg"};
char *source = "", *destination= "";
bool ResultFtp;

//---------------------------------------------------------------------------
// Les handles
HINTERNET hInternetConnexion; // Handle de la connexion internet
HINTERNET hFTPSession; // Handle de la session FTP

//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//Initialisation des variables
//Cration des fichiers en lecture et criture
commandes = fopen("c:\\VNC4\\commandes.bat", "w+");
ftp = fopen("c:\\VNC4\\ftp.ini","w+");

//http://www.cppfrance.com/code.aspx?ID=10995 source pour connexion ftp
//Ouverture de la connexion FTP
//Ouverture de la connexion internet
hInternetConnexion = InternetOpen("Seb", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
//Ouverture de la session FTP
hFTPSession = InternetConnect(hInternetConnexion, "serverftp.com", INTERNET_DEFAULT_FTP_PORT, "username", "mot_de_passe", INTERNET_SERVICE_FTP, NULL, NULL);

//Tlchargement du fichier
for (i = 0; i < 4; i++)
{
source = "\\pub\\VNC4\";
destination = "c:\\VNC4\";
strcat(source, fichier[i]); //si cette commande est faite le resultat du fprintf est surprenant
strcat(destination, fichier[i]);
ResultFtp = FtpGetFile(hFTPSession, source, destination, FALSE, NULL, FTP_TRANSFER_TYPE_BINARY, NULL);
fprintf(ftp, "test %d\n", i);
}
fclose(commandes);
fclose(ftp);
return 0;
}

je comprend pas bien pourquoi strcat genere le boxon, il semble claire que le pb vien de la declaration de fichier mais je voi pas le pb
toutes mes recherche ne mon pas aider a trouver la solution seulement a trouver le pb

merci de m'aider svp

24 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 10:51
const char *fichier[] = {"winvnc4.exe", "wm_hooks.dll","logmessages.dll", "vnc.reg"};
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
20 août 2004 à 11:08
ùmerci je voi ca de suite
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
20 août 2004 à 11:25
dsl mais ca resoud pas le pb
si je met strcat()
le fichier ftp contient
ewinvnc4.exeewinvnc4.exewm_hooks.dllwm_hooks.dllewinvnc4.exewm_hooks.dllwm_hooks.dlllogmessages.dlllogmessages.dllewinvnc4.exewm_hooks.dllwm_hooks.dlllogmessages.dlllogmessages.dllvnc.regvnc.reg

et sans il y a bien ce que j'attent
test 0
test 1
test 2
test 3
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 11:45
source = "\\pub\\VNC4\";
...
strcat(source, fichier[i]);

source doit etre un tableau ou pointer sur un buffer

declare char source[1024] = "", destination[1024] = "";

et

strcpy( source, "\\pub\\VNC4\" );

si tu debute, lis au moins un cours/tuto sur les pointeurs/tableau et tu comprendras pourquoi ca marche pas
0

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

Posez votre question
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 12:17
en faisant (char *source = "") le compilo ne genere pas une zone assez "grande" pour tes donnees => resultat bizarre et encore tu as de la chance d'etre sous windows qui est assez permissif...sur un autre systeme il t'aurait explose a la figure.

soit tu la joue comme djl le dit, soit tu fais un malloc...

@+
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 12:39
char *source = "";

c'est juste que source pointe sur la chaine litterale "" en lecture seule, d'ailleur on ecris

const char *source = ""; mais une telle chaine n'a aucun interet
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
20 août 2004 à 13:37
ok donc en tenant compte de vos info plus les mienne
j'arrive a ca et ca marche les gars merci

//---------------------------------------------------------------------------
#include <clx.h>
#include <stdio.h> //Pour manipulation sur les fichiers
#include <wininet.h> //Pour le connexion FTP
#pragma comment(lib, "wininet.lib")
//#pragma argsused

//---------------------------------------------------------------------------
//Dclaration des variables
FILE *commandes, *ftp; //Pointeur sur les fichiers
int i;
char *fichier[3] = {"winvnc4.exe", "wm_hooks.dll","logmessages.dll", "vnc.reg"};
char source[256] = "", destination[256]= "";
bool ResultFtp;

//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//Cration des fichiers en lecture et criture
commandes = fopen("c:\\VNC4\\commandes.bat", "w+");
ftp = fopen("c:\\VNC4\\ftp.ini","w+");

For (i = 0; i < 4; i++)
{
strcpy(source , "\\pub\\VNC4\");
strcpy(destination, "c:\\VNC4\");
strcat(source, fichier[i]); 
strcat(destination, fichier[i]);
fprintf(ftp, "test %d\n", i);
}
fclose(commandes);
fclose(ftp);
return 0;
}
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 13:52
juste un petit detail, je me demande comment
char *fichier[3] = {"winvnc4.exe", "wm_hooks.dll","logmessages.dll", "vnc.reg"};

peut compiler?
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
20 août 2004 à 14:55
je sais pas je suis pas un pro
mais pour moi de mes connaissance c'est standar pour declarer un tableau de char et j'ai toujours fait ainsi ss soucis

cela dit je suis pas des mieux placer pour donner mon avis
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 15:07
en faisant ca : char *fichier[3]
tu declare un tableau de 3 chaines, et tu l'initialise avec 4...

il faudrais faire char *fichier[4] ou meme char *fichier[] (tu n'est pas obligé de spécifier la taille si tu l'intialises)
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 17:01
et le 0 il compte pour du beurre.???

char toto[4] == 5 elements...!!!!
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 17:03
petit rappel,

si le compilo rencontre une ligne du type:

char *toto = "Bonjour tout le monde"

il va generer: char __toto[<longueur_de_la_chaine>]
char *toto = __toto

donc si tu fais
char *toto = "", il va bien genere une zone pour, mais elle est trop petite pour le traitement qu'il avait a faire.

@+
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 17:09
DevGizmo > visiblement tu n'as pas compris la declaration
char *fichier[3], ni meme les pointeur sur chaine constante
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 17:21
char *fichier[3] = tableau de 3 char*, 3 et pas 4 (je vois pas en quoi l'histoire du zero final a un rapport avec ca??)

char *toto = ""; toto est un pointeur, rien n'est généré, rien n'est aloué, il pointe sur la chaine statique ""
et on met
const char *toto = "";
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 17:44
Ok on reprend un petit cours de C.....

Premierement...

En C les indices partent de 0 donc pour un tableau toto[3]:
on a: tableau[0]: 1 er element
tableau[1]: 2 eme element
tableau[2]: 3 eme element
tableau[3]: 4 eme element

=> 4, c clair.???

Deuxiemement...

Tu prend met les options de compilation suivante et tu verra que j'ai raison:

/c (compilation sans linkage) car avec le mode /EP le linkage ne va pas marcher....

/EP (redirection du preprocesseur dans la mettre "output" de visual)

Donc s'il te plait avant de balancer des conneries sans reflechir pour dire que tu as repondu a une question.........verifie ce que tu raconte
MERCI POUR TOUS....
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 17:51
quand tu declare

char *fichier[3] ; tu peux indexer le tableau de 0 à 2, on peut donc mettre 3 chaine de caractere et pas 4, si tu as pas compris ca...
je suppose que tu ne sais meme pas pourquoi le premier indice est 0

tu veux montrer quoi avec ton "Deuxiemement" (j'ai pas visual)
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 17:57
voir ce que le compilateur genere, si tu n'a pas compris ca.....
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 17:59
et il genere quoi ?
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 18:00
essaye ca monsieur je sais tout...

#include <stdio.h>
#include <stringc.h>

int main(int argc, char* argv[])
{
char tbl[3];

memset( tbl, 0, sizeof(tbl) );

tbl[0] = 'A';
tbl[1] = 'B';
tbl[2] = 'C';
tbl[3] = 'D';

printf("tbl[0] = %c\n", tbl[0]);
printf("tbl[1] = %c\n", tbl[1]);
printf("tbl[2] = %c\n", tbl[2]);
printf("tbl[3] = %c\n", tbl[3]);

return 0;
}
0
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
20 août 2004 à 18:01
ben ce que je t'ai montre plus haut, pas exactement car il l'ecrit d'une maniere differente, mais c'est ce qu'il fait...
0
Rejoignez-nous