Existe-t-il un moyen de spécifier le nombre de caractères d'une chaîne à afficher (similaires aux décimales dans int
s)?
printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");
J'aimerais que ce soit imprimé: Here are the first 8 chars: A string
La méthode de base est la suivante:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
L'autre façon, souvent plus utile, est la suivante:
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 de printf (), qui considère le '*' dans le format comme une requête 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 au moment de l'exécution - de manière plus réaliste dans un scénario tel que:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
La spécification POSIX pour printf()
définit ces mécanismes.
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
% 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
En utilisant printf
vous pouvez faire
printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
Si vous utilisez C++, vous pouvez obtenir le même résultat en utilisant la STL:
using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;
Ou, moins efficacement:
cout << "Here are the first 8 chars: " <<
string(s.begin(), s.begin() + 8) << endl;
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:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char hello[] = "Hello world";
printf("message: '%.3s'\n", hello);
printf("message: '%.*s'\n", 3, hello);
printf("message: '%.*s'\n", 5, hello);
return 0;
}
Impressions:
message: 'Hel'
message: 'Hel'
message: 'Hello'
Imprimer les quatre premiers caractères:
printf("%.4s\n", "A string that is more than 8 chars");
Voir ce lien pour plus d'informations (consultez la section .precision)
En C++, c'est facile.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
EDIT: Il est également plus sûr d’utiliser ceci avec des itérateurs de chaîne, de sorte que vous ne couriez pas jusqu'au bout. Je ne sais pas trop ce qui se passe avec printf et string qui sont trop courts, mais je suppose que cela pourrait être plus sûr.
printf (..... "%. 8s")
En C++, je le fais de cette manière:
char *buffer = "My house is Nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
Veuillez noter que ceci n’est pas sûr car lors du passage du 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.