2011-02-13 8 views
2

Je rencontre un problème lors de l'utilisation de la longueur de chaîne exacte,% Ns, du modificateur de format dans sscanf. Lorsque le buff contient O 5 hello R 700, le code fonctionne correctement. mais quand j'essaye d'avoir un espace dans le champ de nom cela ne fonctionne pas. c'est-à-dire, quand le buff contient O 6 h ello R 700 il échoue. il fait name contiennent "h" et des drapeaux contiennent "ello" au lieu de name contenant "h ello"C sscanf longueur exacte

// buff will contain something in the format of "O <name_length> <name> <flags> <mode>" 

int namelen; 
char name[BUFFSIZE]; 
char flags[BUFFSIZE]; 
char mode[20]; 

sscanf(buff, "O %d", &namelen); 

char extractor[BUFFSIZE]; 
sprintf(extractor, "O %%d %%%ds %%s %%s", namelen); 

sscanf(buff, extractor, &namelen, name, flags, mode); 

Répondre

2

%s matchs non seulement des espaces blancs. Vous voulez %[…], ou mieux encore, %c (prenez soin d'ajouter vous-même le NUL).

En outre, %*d va scanner un chiffre mais pas enregistrer, que je pense que vous préférez (puisque vous avez déjà namelen d'avant).

Mais globalement j'éviterais probablement de générer la chaîne de format à l'exécution.

int namelen, offset; 
char name[BUFFSIZE]; 
char flags[BUFFSIZE]; 
char mode[20]; 

sscanf(buff, "O %d %n", &namelen, &offset); 
memcpy(name, buff + offset, namelen); 
name[namelen + 1] = '\0'; 
sscanf(buff + offset + namelen, " %s %s", flags, mode); 

(non testé, mais quelque chose comme ça devrait fonctionner.)

+0

agréable. tout ce que je devais changer était 'name [namelen + 1]' juste 'name [namelen]' et ça a fonctionné parfaitement. et vous m'avez appris% * d et% n. Merci beaucoup. –