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

TTT
la source

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.

Jonathan Leffler
la source
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

développementalinsanité
la source
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'
Hlovdal
la source
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;
Peter Alexander
la source
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)

Anssi
la source
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.

Chris H
la source
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.

Rodolk
la source