web-dev-qa-db-fra.com

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

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

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

90
T.T.T.

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.

178
Jonathan Leffler
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

10
developmentalinsanity

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;
9
Peter Alexander

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'
7
hlovdal

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)

4
Anssi

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. 

3
Chris H

printf (..... "%. 8s")

2
pm100

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.

0
rodolk