La méthode de base est:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
L'autre moyen, souvent plus utile, est:
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
Ici, vous spécifiez la longueur en tant qu'argument int pour printf (), qui traite le '*' dans le format comme une demande pour obtenir la longueur d'un argument.
Vous pouvez également utiliser la notation:
printf ("Here are the first 8 chars: %*.*s\n",
8, 8, "A string that is more than 8 chars");
Ceci est également analogue à la notation "% 8.8s", mais vous permet à nouveau de spécifier les longueurs minimale et maximale à l'exécution - de manière plus réaliste dans un scénario comme:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
La spécification POSIX pour printf()
définit ces mécanismes.
Jonathan Leffler
la source
-
) pour atteindre la longueur spécifiée complète.% 8s spécifierait une largeur minimale de 8 caractères. Vous voulez tronquer à 8, utilisez donc% .8s.
Si vous voulez toujours imprimer exactement 8 caractères, vous pouvez utiliser% 8.8s
la source
En plus de spécifier un nombre fixe de caractères, vous pouvez également utiliser
*
ce qui signifie que printf prend le nombre de caractères d'un argument:Impressions:
la source
En utilisant
printf
vous pouvez faireSi vous utilisez C ++, vous pouvez obtenir le même résultat en utilisant la STL:
Ou, moins efficacement:
la source
ostream_iterator<char>(cout)
! Au lieu de cela, utilisezostreambuf_iterator<char>(cout)
! La différence de performance devrait être assez grande.std::cout.write(s.data(), 8)
. Ou en C ++ modernestd::cout << std::string_view{s.data(), 8}
.Imprimez les quatre premiers caractères:
printf("%.4s\n", "A string that is more than 8 chars");
Voir ce lien pour plus d'informations (voir .precision -section)
la source
En C ++, c'est facile.
EDIT: Il est également plus sûr de l'utiliser avec des itérateurs de chaîne, afin de ne pas courir à la fin. Je ne sais pas ce qui se passe avec printf et string qui sont trop courts, mais je suppose que cela peut être plus sûr.
la source
std::cout << someStr.substr(0,8);
est bien plus évidente.printf (..... "%. 8s")
la source
En C ++, je le fais de cette manière:
Veuillez noter que ce n'est pas sûr car en passant le deuxième argument, je peux aller au-delà de la taille de la chaîne et générer une violation d'accès à la mémoire. Vous devez mettre en œuvre votre propre contrôle pour éviter cela.
la source