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


127

Existe-t-il un moyen de spécifier le nombre de caractères d'une chaîne à imprimer (similaire aux décimales dans ints)?

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

Souhaitez-le imprimer: Here are the first 8 chars: A string

Réponses:


226

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.


2
Pour le dernier exemple: que faire si la chaîne copiée est plus courte que minlen?
véritéseeker

4
La sortie sera remplie de blanc (sur la gauche, sauf si vous ajoutez a -) pour atteindre la longueur spécifiée complète.
Jonathan Leffler

13
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


13

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'

11

En utilisant printfvous 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;

1
Remarque: ne pas utiliser ostream_iterator<char>(cout)! Au lieu de cela, utilisez ostreambuf_iterator<char>(cout)! La différence de performance devrait être assez grande.
Dietmar Kühl

De façon plus efficace d'utiliser à la place: std::cout.write(s.data(), 8). Ou en C ++ moderne std::cout << std::string_view{s.data(), 8}.
Artyer

4

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)


4

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 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.


32
ha, ouais c'est "facile". C ++ ressemble toujours à un accident de voiture.
President James K.Polk

vous pouvez toujours faire printf () en c ++ :)
StasM

6
Je pense que c'était du sarcasme. std::cout << someStr.substr(0,8);est bien plus évidente.
MSalters le

2
@MSalters Vous devriez poster cela comme réponse.
Jonathan Mee


1

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 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.