7
votes

Y a-t-il une version wchar_t pour asprintf?

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 snaprintf 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.

swprintf renvoie -1 en cas d'erreur, pas la longueur nécessaire (pourquoi pas le même comportement?!?)

Le titre mentionné asprintf semble être d'aucune aide aussi, car il fournit une version non large.

_vscwprintf 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.

Des idées? Merci!


0 commentaires

3 Réponses :


2
votes

Eh bien, il semble y avoir une faille fondamentale dans vos attentes. Ajoutez-les:

  1. Windows a ce que vous voulez
  2. Linux a une variante non large ( asprintf n'est dans aucune norme, mais purement une extension GNU pour Linux et * BSD).
  3. POSIX définit tout ce qui est lié à la chaîne / fichier en tant que tableau (code> TROP * NULL), ce qui explique le manque de versions de grandes versions de toute fonction POSIX.
  4. 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é".

    Ajout de ces informations donne: Pourquoi auriez-vous besoin d'une chose comme ça? Vous n'utilisez sûrement pas wchar_t s sur UNIX êtes-vous ;) . Si vous êtes, il y a encore deux options: Basculez vers un TCHAR SOLUTION Solution (Dépendante de la plate-forme Typedef) ou complètement basculer sur UTF-8.


2 commentaires

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.



3
votes

Oui, swprintf . Notez que malgré son nom, swprintf est l'équivalent de caractère large de snaprintf , pas sprintf , 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.

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.


2 commentaires

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.



3
votes

POSIX 2008 a ajouté le Open_wmemMStream Fonction qui, avec vfwprintf , 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.

Ceci peut facilement être utilisé pour construire un wrapper AWPRINTF .


2 commentaires

Merci beaucoup. Ce hack est sympa et cela fonctionne réellement.Je ne comprend toujours pas pourquoi les choses si simples comme awprintf 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 sauf quand ils doivent ...