J'ai besoin d'une fonction C qui retourne la longueur finale d'une chaîne formatée afin que je puisse attribuer correctement la chaîne cible plutôt que de calculer la longueur moi-même. Il y a Le titre mentionné Des idées? Merci! P> snaprintf code> qui fait exactement cela lors de l'incapacité à écrire la chaîne entière, mais malheureusement, il n'y a pas de large chariot alternative pour cela. P>
swprintf code> renvoie -1 en cas d'erreur, pas la longueur nécessaire (pourquoi pas le même comportement?!?) p>
asprintf code> semble être d'aucune aide aussi, car il fournit une version non large. P>
_vscwprintf code> peut être utilisé sous Windows, mais j'ai besoin d'une plate-forme crossplate, de version standard ou d'au moins une version Linux et je vais #Ifdef le code. P>
3 Réponses :
Eh bien, il semble y avoir une faille fondamentale dans vos attentes. Ajoutez-les: p>
asprintf code> n'est dans aucune norme, mais purement une extension GNU pour Linux et * BSD). LI>
- POSIX définit tout ce qui est lié à la chaîne / fichier en tant que tableau (code> TROP * CODE> NULL), ce qui explique le manque de versions de grandes versions de toute fonction POSIX. LI>
- sur 2, 3 et 4, toutes les distributions de Linux modernes sont basées sur UTF-8, ce qui signifie que les versions non larges sont ce qui est "destiné à être utilisé". Li>
ol>
Ajout de ces informations donne: Pourquoi auriez-vous besoin d'une chose comme ça? Vous n'utilisez sûrement pas wchar_t code> s sur UNIX êtes-vous ;) code>. Si vous êtes, il y a encore deux options: Basculez vers un TCHAR CODE> SOLUTION Solution (Dépendante de la plate-forme Typedef) ou complètement basculer sur UTF-8. P>
Merci d'avoir répondu. Oui, j'ai un peu à utiliser WCHAR_T et la commutation sur UTF-8 pourrait être trop coûteuse.
@ gheorghe1800: ferraille wchar_t et utilisez utf-8 . Si vous l'aviez suivi, cette question n'aurait pas été née.
Oui, En outre, puisqu'il renvoie -1 sur trop-plein, vous devrez obtenir la longueur totale de la chaîne d'une autre manière. La seule façon vraiment portable de le faire est de commencer avec un tampon de taille, essayez de formater et de voir si elle est assez grande, et sinon, augmentez la taille et reformatez jusqu'à ce qu'il soit assez grand. Ce n'est pas très efficace, comme vous pouvez l'imaginer. P> swprintf code> . Notez que malgré son nom, swprintf code> est l'équivalent de caractère large de snaprintf code>, pas em> sprintf code>, dans ce prend une taille de mémoire tampon comme son deuxième paramètre; Il y a (heureusement) aucune version de caractère large qui ne prend pas une taille de mémoire tampon. P>
Merci. C'est ce que j'avais pensé en premier lieu, je viens d'espérer qu'il y a une meilleure solution déjà mise en œuvre. Enfin, je pense que je devrai calculer la longueur moi-même, ce qui semble être sujette d'erreur sur le cas général, mais je veillerai à être complète.
Il y a un meilleur moyen; voir ma réponse. Vous voudrez peut-être revenir à la solution d'Adam pour les systèmes PRE-POSIX-2008.
POSIX 2008 a ajouté le Ceci peut facilement être utilisé pour construire un Open_wmemMStream code> Fonction qui, avec vfwprintf code>, fait exactement ce dont vous avez besoin. C'était autrefois une extension GNU, elle a donc été disponible sur les systèmes GNU pendant une longue période. P>
wrapper AWPRINTF CODE>. P>
Merci beaucoup. Ce hack est sympa et cela fonctionne réellement.Je ne comprend toujours pas pourquoi les choses si simples comme awprintf code> ne font pas partie de la norme lorsque des fonctionnalités plus complexes sont ajoutées.
Probablement parce que la norme en question est POSIX et presque personne codant pour POSIX Systems utilise wchar_t code> sauf quand ils doivent ...