[langage c] question (en cours)
Publié : mer. 13 avr. 2016, 18:47
Bonjour,
On peut poser des questions sur un programme écrit en C sur ce forum ?
On peut poser des questions sur un programme écrit en C sur ce forum ?
Forum d'entraide ! Posez vos questions ici
https://forums.archlinux.fr/
Code : Tout sélectionner
/* On boucle tant que l'utilisateur ne veut pas quitter */
while((strstr(msg, "LOGOUT\r\n")) == NULL)
{
char *data = ""; /* Chaine contenant la réponses du serveur */
i++;
/* Saisie de l'utilisateur */
printf("\n> ");
input(tmp, 1024); /* Voire la fonction input comme la fonction scanf, mais en plus évolué */
sprintf(msg, "%d %s\r\n", i, tmp); /* On construit le message à envoyer au serveur mail */
/* Envoie de la saisie au serveur */
if(send(sock, msg, strlen(msg), 0) < 0)
{
perror("send()");
exit(errno);
}
/* Récupération des données */
do {
/* On recoit les données par bloc de 1024 octets */
if((n = recv(sock, buffer, sizeof buffer, 0)) < 0)
{
perror("recv()");reqûete
exit(errno);
}
/* On termine la chaine de caractère par le '\0' de fin de chaine */
if(n < 1024)
buffer[n] = '\0';
/* VERSION 1 : COMMENTER CETTE LIGNE */
data = add(data, buffer); /* Reconstruction de la chaine */
/* On ferme le serveur à la demande de l'utilisateur */
if((strstr(msg, "LOGOUT\r\n")) != NULL)
{
printf("Serveur fermé !\n\n");
break;
}
/* VERSION 1 : DECOMMENTER CES DEUX LIGNES */
//else
// printf("%s", buffer);
} while(strstr(buffer, "completed.\r\n") == NULL);
/* VERSION 1 : COMMENTER CETTE LIGNE */
printf("%s", data);
free(data);
}
Code : Tout sélectionner
char *add(char *ch1, char *ch2)
{
char *data = "";
int i, j, n = strlen(ch1), m = strlen(ch2);
data = (char*) malloc(n * sizeof(char) + m * sizeof(char));
//strcat(data, ch1);
//strcat(data, ch2);
for(i = 0 ; i < n ; i++)
data[i] = ch1[i];
for(j = i ; j < m+n ; j++)
data[j] = ch2[j-i];
return data;
}
Code : Tout sélectionner
char buffer[1024];
Code : Tout sélectionner
data = add(data, buffer)
Code : Tout sélectionner
asprintf(&data, "%s%s", ch1, ch2)
Non, justement buffer est déclaré comme ceci :oktoberfest a écrit :J'imagine que buffer est déclaré comme ça :Premier souci : si tu reçois précisément 1024 caractères, tu n'auras pas de '\0' de fin de chaîne à la fin de buffer. Donc ta fonction add ne va pas trop bien marcher.Code : Tout sélectionner
char buffer[1024];
Code : Tout sélectionner
char buffer[1025];
Je ne connaissais pas asprintf() . Mais lorsque je marque :benjarobin a écrit :Ta fonction add ne réserve pas via le malloc le \0 de fin.
Sinon pourquoi ne pas utiliser strcpy et strcat ? Voir encore plus simple de remplacer toute cette fonction (ok c'est un peu moins rapide mais vraiment tu n'est pas à quelques us prêt) parCode : Tout sélectionner
asprintf(&data, "%s%s", ch1, ch2)
Code : Tout sélectionner
asprintf(&data, "%s%s", data, buffer)
AchilleFraisse a écrit : il me dit implicit declaration of function asprintf.
Code : Tout sélectionner
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
[...]
Code : Tout sélectionner
#define _GNU_SOURCE 1
#include <stdio.h>
int main(void)
{
char *data = NULL;
const char *ch1 = "hello";
const char *ch2 = " world";
asprintf(&data, "%s%s", ch1, ch2);
puts(data);
return 0;
}
Code : Tout sélectionner
gcc -std=c99 -O2 -Wall -Wextra t.c -o t