Réponses:
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.
-
) pour atteindre la longueur spécifiée complète.
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
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'
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;
ostream_iterator<char>(cout)
! Au lieu de cela, utilisez ostreambuf_iterator<char>(cout)
! La différence de performance devrait être assez grande.
std::cout.write(s.data(), 8)
. Ou en C ++ moderne std::cout << std::string_view{s.data(), 8}
.
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.
std::cout << someStr.substr(0,8);
est bien plus évidente.
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.