Supposons que vous ayez une chaîne qui n'est PAS null
terminée 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 savoir maintenant ...Utilisation de printf avec une chaîne terminée non nulle
Répondre
Il y a une possibilité avec printf, il va comme ceci:
printf("%.*s", stringLength, pointerToString);
Pas besoin de copier quoi que ce soit, pas besoin de modifier l'original chaîne ou tampon.
Mais de toute façon c'est dangereux, quelqu'un va un jour imprimer cette chaîne avec% s – pmod
Oui, c'est ça! – whoi
@Pmod: Pas nécessairement si le tampon n'est pas exposé au monde extérieur. Il est également très utile d'imprimer simplement * parties * d'une chaîne (qui peut être terminée par un caractère nul, bien sûr). Si vous voulez vraiment voir cela en action, jetez un oeil au proxy SIP OpenSER/Kamailio où ils évitent de copier beaucoup de choses à cause de cette technique (en utilisant aussi sprintf). – DarkDust
#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;
}
Je modifié 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;
}
Très mauvaise performance en raison de beaucoup de lectures d'octets inutiles (qui viennent avec une pénalité de performance si l'octet n'est pas sur une adresse alignée sur la plupart des processeurs) et que l'analyse et la mise en forme sont effectuées pour chaque caractère. Ne faites pas ça :-) Voir ma réponse pour la solution. – DarkDust
Merci d'avoir mentionné –
@DarkDust: seule une machine pathologique pourrait pénaliser les lectures d'octets non alignées sur les limites de mots. Pensez-vous que les lectures de mots ne sont pas alignées sur les limites des mots? Ou une ancienne merde mips ou quelque chose? –
printf("%.*s", length, string)
ne fonctionnera pas.
Cela signifie d'imprimer une longueur d'octet OU un octet nul, selon la première éventualité. Si votre tableau-of-char non-null-terminated contient des octets NULL AVANT la longueur, printf s'arrêtera sur ceux-ci, et ne continuera pas.
Vous pouvez utiliser fwrite() pour stdout!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
De cette façon, vous affichera les premiers caractères (nombre défini dans la variable number_of_chars) dans un fichier, dans ce cas stdout (la sortie standard, votre écran)!
Très utile lorsque vous voulez inspecter un long tampon contenant des chaînes et des zéros! – Elist
Voici une explication du fonctionnement de %.*s
et de son emplacement.
Les spécifications de conversion dans une chaîne de modèle de 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 des arguments:
Vous pouvez également spécifier une précision de '*'. Cela signifie que l'argument suivant dans la liste des arguments (avant la valeur réelle à imprimer) est utilisé comme précision. La valeur doit être un int, et est ignorée si elle est négative.
- Output conversion syntax dans le manuel glibc
Pour %s
la mise en forme de chaîne, la précision a une signification particulière:
Une précision peut être spécifiée pour indiquer le nombre maximal de caractères à écrire; sinon, les caractères dans la chaîne jusqu'à mais n'incluant pas le caractère null de fin sont écrits dans le flux de sortie.
- dans le manuel glibc
D'autres variantes utiles:
"%*.*s", maxlen, maxlen, val
va droit justifier, insérer des espaces avant;"%-*.*s", maxlen, maxlen, val
justifie à gauche.
Si je comprends bien, ce qui suit pad la sortie tout en empêchant encore un dépassement de chaîne? '"% - *. * S ", remplissage, str_view.size(), str_view.data()' – scx
printf("%.5s", pointerToNonNullTerminatedString);
La longueur de la chaîne sera 5.
- 1. Chaîne non nulle terminée - une erreur KlocWork sans raison compréhensible
- 2. L'appel de system() C échoue avec l'erreur "chaîne non terminée"
- 3. littéral chaîne non terminée
- 4. chaîne Javascript non terminée
- 5. chaîne non terminée dans JQuery
- 6. Non annulé chaîne terminée fausse alarme?
- 7. printf modifier une chaîne
- 8. code Javascript, chaîne non terminée console
- 9. avec printf
- 10. NSRunningApplication 'terminée' non observable
- 11. non terminée erreur Parenthetical avec une expression régulière en Javascript
- 12. Comment contourner l'infâme erreur "chaîne littérale non terminée"?
- 13. Conversion d'une chaîne C (\ 0 terminée) en une chaîne PHP
- 14. MySQL mystery: La valeur nulle n'est pas différente de la chaîne non nulle
- 15. NHibernate - propriété non-nulle référence une valeur
- 16. non nulle et est une contrainte unique
- 17. Chaîne à terminaison nulle
- 18. Vérification de la chaîne querystring pour une valeur non nulle à l'aide de JS
- 19. PHP: Formatage de chaînes avec printf
- 20. Sélection d'une colonne non nulle
- 21. Utilisation de db: remplissage provoquant une exception nulle
- 22. Utilisation du tableau de longueur nulle
- 23. Utilisation de _tcstoul pour détecter une chaîne non valide lors d'une conversion longue non signée - impossible de traiter la chaîne -ve comme une valeur invalide
- 24. Centrage des chaînes avec printf()
- 25. Macro C pour générer une chaîne au format printf
- 26. org.apache.jasper.JasperException .... <% non terminée tag page @
- 27. Avec stdint.h et ANSI printf?
- 28. Chaîne terminée par NULL et sa longueur
- 29. OSX, G/AWK, Bash - "déclaration illégale, chaîne non terminée" et pas de sortie de fichier
- 30. System.Data.SqlClient.Exception (0x80131904) Chaîne ou binaire serait terminée
Dans 'contexte C', toutes les chaînes sont nulles terminées. Les tableaux de char sans null dans eux ne sont pas des chaînes ... ils sont des tableaux de char :) – pmg
duplication possible de [Comment imprimer une chaîne non-terminée par zéro en utilisant printf?] (Http://stackoverflow.com/ questions/2137779/how-do-i-print-a-non-terminated-string-using-printf) – Justin
https://stackoverflow.com/questions/2239519/-there-a-specifier -comment-plusieurs-caractères-d'un-string-à-print-out-pri –