2010-02-10 4 views

Répondre

135

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, souvent plus utile, est: il

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

Ici, vous indiquez la longueur comme un argument int à printf(), qui traite le '*' dans le format en tant que 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 « % 8.8s » notation, mais encore une fois vous permet de spécifier la longueur minimale et maximale à l'exécution - plus réaliste dans un scénario comme:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info); 
+2

Au dernier exemple: Que faire si une chaîne copiée est plus courte que minlen? – truthseeker

+3

La sortie sera complétée en blanc (à gauche sauf si vous ajoutez un '-') pour atteindre la longueur maximale spécifiée. –

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

% 8s préciseraient une largeur minimale de 8 caractères (..... "% 8s."). Vous voulez tronquer à 8, utilisez donc% .8s.

Si vous souhaitez imprimer toujours exactement 8 caractères que vous pouvez utiliser% 8.8s

2

En C++, il 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 avec itérateurs de chaîne, afin de ne pas l'extrémité. Je ne suis pas sûr de ce qui arrive avec printf et string qui sont trop courts, mais je suppose que c'est peut-être plus sûr.

+20

ha, ouais c'est "facile". C++ ressemble toujours à un accident de voiture. –

+0

vous pouvez toujours faire printf() en C++ :) – StasM

+6

Je pense que c'était sarcasme. 'std :: cout << someStr.substr (0,8);' est beaucoup plus évident. – MSalters

7

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; 
+0

Note: ne ** pas ** utiliser 'ostream_iterator (cout)'! Au lieu de cela, utilisez 'ostreambuf_iterator (cout)'! La différence de performance devrait être plutôt grande. –

4

En plus de spécifier un montant 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; 
} 

Prints:

message: 'Hel' 
message: 'Hel' 
message: 'Hello' 
3

Imprimer quatre premiers caractères:

printf("%.4s\n", "A string that is more than 8 chars");

Voir this link pour plus d'informations (vérifier .precision -section)

0

En C++, je le fais de cette façon:

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

S'il vous plaît noter que ce n'est pas en sécurité parce que lors du passage du deuxième argument que je peux 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 place votre propre vérification pour éviter cela.

Questions connexes