web-dev-qa-db-fra.com

Utilisation de printf avec une chaîne terminée non nulle

Supposons que vous ayez une chaîne qui n'est PAS terminée par null et que vous connaissiez sa taille exacte, alors comment pouvez-vous imprimer cette chaîne avec printf en C? Je me souviens d'une telle méthode mais je ne peux pas le découvrir maintenant ...

93
whoi

Il y a une possibilité avec printf, ça se passe comme ceci:

printf("%.*s", stringLength, pointerToString);

Pas besoin de copier quoi que ce soit, pas besoin de modifier la chaîne ou le tampon d'origine.

158
DarkDust

Voici une explication de la façon dont %.*s fonctionne, et où il est spécifié.

Les spécifications de conversion dans une chaîne de modèle printf ont la forme générale:

% [ param-no $] flags width [ . precision ] type conversion

ou

% [ param-no $] flags width . * [ param-no $] type conversion

La deuxième forme est pour obtenir la précision de la liste d'arguments:

Vous pouvez également spécifier une précision de "*". Cela signifie que l'argument suivant dans la liste d'arguments (avant la valeur réelle à imprimer) est utilisé comme précision. La valeur doit être un entier et est ignorée si elle est négative.

- Syntaxe de conversion de sortie dans le manuel de la glibc

Pour %s formatage des chaînes, la précision a une signification particulière:

Une précision peut être spécifiée pour indiquer le nombre maximum de caractères à écrire; sinon, les caractères de la chaîne jusqu'au, mais sans inclure le caractère nul final, sont écrits dans le flux de sortie.

- Autres conversions de sortie dans le manuel de la glibc

Autres variantes utiles:

  • "%*.*s", maxlen, maxlen, val justifiera à droite, en insérant des espaces avant;
  • "%-*.*s", maxlen, maxlen, val justifiera à gauche.
22
Tobu

Vous pouvez utiliser un fwrite () pour stdout!

fwrite(your_string, sizeof(char), number_of_chars, stdout);

De cette façon, vous sortirez les premiers caractères (nombre défini dans la variable number_of_chars) dans un fichier, dans ce cas vers stdout (la sortie standard, votre écran)!

20
Pedro Sousa

printf("%.*s", length, string) ne fonctionnera PAS.

Cela signifie d'imprimer JUSQU'À longueur octets OR un octet nul, selon la première éventualité. Si votre tableau de caractères non terminé par null contient des octets nuls AVANT la longueur, printf s'arrêtera sur ceux et ne pas continuer.

8
Todd Freed
printf("%.5s", pointerToNonNullTerminatedString);

La longueur de la chaîne sera de 5.

2
codeDom
#include<string.h> 
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
 int i;
 for(i=0;i<n;i++)
 {
 printf("%c",str[i]);
 }
 return 0;
}

J'ai édité le code, voici une autre façon:

#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/

return 0;

}
1
Fahad Uddin