Existe-t-il un moyen de spécifier le nombre de caractères d’une chaîne à imprimer en utilisant printf ()?

Y a-t-il un moyen de spécifier combien de caractères d’une chaîne à imprimer (similaire aux décimales dans int s)?

 printf ("Here are the first 8 chars: %s\n", "A ssortingng that is more than 8 chars"); 

Aimerait-il imprimer: Here are the first 8 chars: A ssortingng

Le moyen de base est le suivant:

 printf ("Here are the first 8 chars: %.8s\n", "A ssortingng 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 ssortingng 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 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 ssortingng that is more than 8 chars"); 

Ceci est également analogue à la notation “% 8.8s”, mais vous permet à nouveau de spécifier les longueurs minimales et maximales à l’exécution – de manière plus réaliste dans un scénario tel que:

 printf("Data: %*.*s Other info: %d\n", minlen, maxlen, ssortingng, info); 
 printf ("Here are the first 8 chars: %.8s\n", "A ssortingng that is more than 8 chars"); 

% 8s spécifierait une largeur minimale de 8 caractères. Vous voulez tronquer à 8, donc utilisez% .8s.

Si vous voulez toujours imprimer exactement 8 caractères, vous pouvez utiliser% 8.8s

Utiliser printf vous pouvez faire

 printf("Here are the first 8 chars: %.8s\n", "A ssortingng 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 ssortingng s("A ssortingng that is more than 8 chars"); cout << "Here are the first 8 chars: "; copy(s.begin(), s.begin() + 8, ostream_iterator(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  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 ssortingng that is more than 8 chars");

Voir ce lien pour plus d’informations (vérifiez la section .precision)

En C ++, c’est facile.

 std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator(std::cout, "")); 

EDIT: Il est également plus sûr d’utiliser ceci avec les iterators de chaîne, de sorte que vous ne courrez pas la fin. Je ne suis pas sûr de ce qui se passe avec printf et ssortingng qui sont trop courts, mais je suppose que cela peut être plus sûr.

printf (….. “%. 8s”)

En C ++, je le fais de cette manière:

 char *buffer = "My house is nice"; ssortingng showMsgStr(buffer, buffer + 5); std::cout << showMsgStr << std::endl; 

Veuillez noter que ceci n'est pas sûr car, lors du passage du second argument, je peux aller au-delà de la taille de la chaîne et générer une violation d'access à la mémoire. Vous devez implémenter votre propre chèque pour éviter cela.