Question

spécifications de conversion de printf sont % suivie par des drapeaux, la largeur, la précision, modificateur de longueur et spécificateur de conversion. Est-il pratique limite à la taille d'une spécification de conversion?

i.e.. %s est de 2 caractères de long, tandis que %08.2f est de 6 caractères de long. Ma question est, quelle est la longueur de la spécification unique maximale dans une chaîne de format qui peut être créé, selon la norme C99?

Était-ce utile?

La solution

Il n'y a pas une telle spécification de conversion de longueur maximale. Si vous pensez que vous avez trouvé une telle spécification, je peux trouver un qui est un charbon plus.

Par exemple, la largeur de champ considérer et précision. La norme dit qu'ils sont des nombres entiers décimaux, mais ne précise pas leur portée. Par conséquent, vous pouvez écrire spécificateurs de conversion avec des nombres entiers arbitrairement grands que la largeur de champ ou de précision.

Autres conseils

Si vous voulez dire une chaîne littérale, il est 4095 caractères

  

5.2.4.1 limites Traduction
  ...
  - 4095 caractères dans un littéral de chaîne de caractères ou littéral large chaîne (après concaténation)
  ...

J'ai été mordu par la limite C89 de 509 caractères (pas pour les chaînes de format printf / scanf), donc c'est l'un des bons changements apportés par C99: -)


Edit: implémentation de la glibc ( pas Définition standard )

la mise en œuvre glibc obtient la largeur d'une fonction de read_int. Ainsi, pour cette mise en œuvre, apparemment, peut-être , la limite est INT_MAX ( Je n'ai pas cherché la fonction read_int ).

  

spécifications de conversion sont printf% suivi par des drapeaux, la largeur, la précision, modificateur de longueur et spécificateur de conversion. Est-il pratique limite à la taille d'une spécification de conversion?

Je devais traiter dans le passé avec plusieurs implémentations standard printf et mon impression générale qu'il n'y a pas de limite particulière imposée.

La chaîne de format est généralement le caractère analysé par caractère. (Pensez simple EFM.) La plupart des implémentations de printf éviter tamponner quoi que ce soit en interne, et même pour les numéros utilisent omble chevalier par la conversion de char en décimal (même pas de atoi).

Vous pouvez vérifier par exemple comment le printf est mis en œuvre à l'intérieur du noyau FreeBSD (où de nombreuses autres implémentations soulever souvent le code). Cela est certainement simplifié la mise en œuvre (avec quelques tweaks spécifiques du noyau), mais il reflète la façon dont la chaîne de format est souvent traitée.

N.B.. Il suffit de vérifier la mise en œuvre de vfprintf() de glibc et ils allouer un tampon interne (si nécessaire) avec malloc(). Ainsi, ni limite particulière là.

  

Ma question est, quelle est la longueur de la spécification unique maximale dans une chaîne de format qui peut être créé, selon la norme C99?

Le spécificateur de format est une partie d'une longueur de la chaîne et la chaîne à ma connaissance ne se limite pas à la norme. Et comme je mentionne ci-dessus, ni j'ai jamais vu une mise en oeuvre avec une telle limite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top