extraire une sous-chaîne
Le
gabriel
bonsoir,
je suis en train de jouer avec un serveur pop et je veux récupérer le
nbre de messages dans la boite.
j'ai ca dans mon buffer :
+OK maildrop ready, 1701 messages (17596741 octets) (5796222 1073741824)
Je veux le "1701".
Ma fonction, non finie, suit.
Je développe sous Linux.
Ce qui m'intéresse avant tout est de savoir quelle est la bonne méthode
pour récupérer une substring dans un tableau de caractères en C.
Cette fonction n'inclut pour l'instant aucun contrôle de mémoire, de
longueur etc.
int getNumberOfMessages(char* buffer)
{
// +OK maildrop ready, 1701 messages (17596741 octets) (5796222 1073741824)
int MsgsQn = 0;
char* temp;
char* cp = strdup(buffer);
char c;
temp = strrchr (cp, ',');
short i = 0;
char *startPoint;
startPoint = temp ;
startPoint++;
// Determine the position of the "m" letter
while (c != 'm')
{
c = *temp;
temp++;
i++;
}
i--;
char* def = malloc(strlen(buffer));
strncpy(def,startPoint,i);
i=0;
while (i<strlen(def))
{
if (*def != ' ')
{
strcat(temp,def);
}
def++;
i++;
}
return MsgsQn;
}
On ne se moque pas, je débute en C :)
Si je suis pas à la bonne adresse, envoyez-moi sur un forum dédié à la
programmation en C sur Linux. Mais je suis surtout intéressé par
l'approche, pas les librairies.
Merci pour votre aide !
je suis en train de jouer avec un serveur pop et je veux récupérer le
nbre de messages dans la boite.
j'ai ca dans mon buffer :
+OK maildrop ready, 1701 messages (17596741 octets) (5796222 1073741824)
Je veux le "1701".
Ma fonction, non finie, suit.
Je développe sous Linux.
Ce qui m'intéresse avant tout est de savoir quelle est la bonne méthode
pour récupérer une substring dans un tableau de caractères en C.
Cette fonction n'inclut pour l'instant aucun contrôle de mémoire, de
longueur etc.
int getNumberOfMessages(char* buffer)
{
// +OK maildrop ready, 1701 messages (17596741 octets) (5796222 1073741824)
int MsgsQn = 0;
char* temp;
char* cp = strdup(buffer);
char c;
temp = strrchr (cp, ',');
short i = 0;
char *startPoint;
startPoint = temp ;
startPoint++;
// Determine the position of the "m" letter
while (c != 'm')
{
c = *temp;
temp++;
i++;
}
i--;
char* def = malloc(strlen(buffer));
strncpy(def,startPoint,i);
i=0;
while (i<strlen(def))
{
if (*def != ' ')
{
strcat(temp,def);
}
def++;
i++;
}
return MsgsQn;
}
On ne se moque pas, je débute en C :)
Si je suis pas à la bonne adresse, envoyez-moi sur un forum dédié à la
programmation en C sur Linux. Mais je suis surtout intéressé par
l'approche, pas les librairies.
Merci pour votre aide !

Poser une question


$ Man string
peut aider.
Elle est cependant laborieuse...
Tu n'as pas besoin de strdup() et de malloc(), ça coûte cher et s'en
passer évite d'oublier les free().
Tu n'as pas besoin de strlen(), ça coûte cher, ni de strcat() ni
strncpy(), idem et en plus c'est casse-gueule.
Tu utilise strrchr(), strchr() aurait été plus heureux car strrchr()
doit scanner le string jusqu'à la fin ce qui est inutile dans ton cas.
Il y a une solution simple :
. Tu recherches la virgule par strchr()
. Tu incrémentes ton pointeur de 1, après avoir vérifié que la virgule a
bien été trouvée.
. Tu utilises strtoul pour récupérer le nombre de messages (ta fonction
pourrait avec profit retourner un long) et tu vérifies errno.
. En cas de condition anormale, tu pourrais renvoyer un nombre négatif
eventuellement printer un message si ce n'est pas la responsabilité de
l'appelant.
Je te laisse faire cet exercice, poste ensuite ton code, on verra si on
peut l'améliorer.
Comme définition de la fonction, je te conseillerais :
long getNumberOfMessages(const char * buffer);
enfin, j'aurais mis get_nb_msgs, je trouve ça plus lisible et moins
java-ish, se rappeler aussi que les noms de fonction ont une taille
maximale (26 ou 27 je crois) en C.
Même les gurus ont commencé débutants.
Ta question n'a rien de spécifique à Linux, tu es dans le bon forum. Je
ne crois pas qu'il y ait de forum fr sur la programmation sous Linux
mais si tu as des questions vraiment spécifiques à Linux tu trouvera
probablement de l'aide sur fr.comp.os.unix.
Toutes les fonctions str... que tu as utilisées sont des fonctions d'une
librairie, oops bibliuthèque !
Sinon pour faire des choses un peu plus complexes tu pourrais gagner à
utiliser une bibliothèque d'expressions régulières.
Dernier conseil, ne fais pas les tests directement sur ta mailbox :-)
--
http://patrick.davalan.free.fr/
ceci duplique ta chaine et tu ne libères pas cp, 1iere fuite
2ieme chaine allouée non libérée.
tu n'as jamais affecté MsgsQn ?! sa valeur est toujours le 0 d'init.
on peut surement faire plus court:
- tester que le buffer est une réponse positive du serveur de mails
if (strstr(buffer, "+OK") != buffer)
error
- skipper tous les caractères alphabétiques et ponctuation
char* ptr = buffer;
while (*ptr && *ptr < '0' || *ptr > '9')
++ptr;
- convertir alors la chaine pointée (1ier digit du nombre)
int count = atoi(ptr);
(atoi interprète les digits décimaux seuls, le texte placé après ne le
gène donc pas).
de rien, je passais par là :)
Sylvain.
Bijôr,
Si tel est le cahier des charges, je vous propose:
int getNumberOfMessages(char* buffer)
{
return 1701;
}
Vous pouvez simplifier et sécuriser:
int getNumberOfMessages(char* buffer)
{
return 0;
}
Sérieusement, quel que soit le langage, il faut définir le problème. Je
le fais donc, ce n'est qu'une proposition:
- buffer est un pointeur valide non NULL. Sinon, vérifier. Sachant
qu'on ne peut en C se prémunir d'un pointeur non NULL et non valide.
Donc, nous considérons buffer non NULL mais pouvant pointer vers une
chaîne vide "