Manipulation de tableau de chaine

Signaler
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006
-
 cs_AlexMAN -
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

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
const char *fichier[] = {"winvnc4.exe", "wm_hooks.dll","logmessages.dll", "vnc.reg"};
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

ùmerci je voi ca de suite
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
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...

@+
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

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;
}
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
juste un petit detail, je me demande comment
char *fichier[3] = {"winvnc4.exe", "wm_hooks.dll","logmessages.dll", "vnc.reg"};

peut compiler?
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

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
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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)
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
et le 0 il compte pour du beurre.???

char toto[4] == 5 elements...!!!!
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
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.

@+
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
DevGizmo > visiblement tu n'as pas compris la declaration
char *fichier[3], ni meme les pointeur sur chaine constante
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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 = "";
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
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....
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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)
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
voir ce que le compilateur genere, si tu n'a pas compris ca.....
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
et il genere quoi ?
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
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;
}
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
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...