Est-il possible d’imprimer seulement une certaine section d’une chaîne de caractères sans faire une sous-chaîne distincte?

Disons que j’ai ce qui suit:

char* ssortingng = "Hello, how are you?"; 

Est-il possible d’imprimer uniquement les 5 derniers octets de cette chaîne? Qu’en est-il des 5 premiers octets seulement? Y a-t-il une variante de printf qui permettrait cela?

Est-il possible d’imprimer uniquement les 5 derniers octets de cette chaîne?

Oui, passez simplement un pointeur sur le cinquième caractère. Vous pouvez déterminer cela par ssortingng + strlen(ssortingng) - 5 .

Qu’en est-il des 5 premiers octets seulement?

Utilisez un spécificateur de précision: %.5s

 #include  #include  char* ssortingng = "Hello, how are you?"; int main() { /* print at most the first five characters (safe to use on short ssortingngs) */ printf("(%.5s)\n", ssortingng); /* print last five characters (dangerous on short ssortingngs) */ printf("(%s)\n", ssortingng + strlen(ssortingng) - 5); int n = 3; /* print at most first three characters (safe) */ printf("(%.*s)\n", n, ssortingng); /* print last three characters (dangerous on short ssortingngs) */ printf("(%s)\n", ssortingng + strlen(ssortingng) - n); return 0; } 

Oui, les cinq derniers octets de cette chaîne peuvent être réalisés avec:

 printf ("%s\n", &(ssortingng[strlen (ssortingng) - 5])); 

Les cinq premiers peuvent être réalisés avec:

 printf ("%.5s\n", ssortingng); 

Vous pouvez également combiner les deux pour obtenir des sous-chaînes dans la chaîne. Le mot how peut être imprimé avec:

 printf ("%.3s\n", &(ssortingng[strlen (ssortingng) + 7])); 

Vous devez faire attention à ce que la chaîne soit suffisamment longue pour que cela fonctionne. L’impression des cinq derniers caractères d’une chaîne à un caractère entraîne un comportement indéfini, car l’index se termine à -4 . En d’autres termes, vérifiez la longueur de la chaîne avant d’essayer cela.

Deux solutions:

Donner une chaîne de caractères prédicable de même longueur – je vais utiliser la date comme exemple et demander de diviser en HH: MM: SS.DDDDDDD

 char date[14] = "2359591234567"; 

[1] Implémentation lisible:

 char hh[3] = {0}; char mm[3] = {0}; char ss[3] = {0}; char dec[8] = {0}; strncpy ( hh, date, 2 ); strncpy ( mm, date+2, 2 ); strncpy ( ss, date+4, 2 ); strncpy ( dec, date+6, 7 ); printf("%s:%s:%s.%s\n", hh, mm, ss, dec); 

[2] Mise en œuvre courte:

Non plus:

 printf("%.2s:%.2s:%.2s.%.7s\n", date, date+2, date+4, date+6); 

ou:

 printf("%2.2s:%2.2s:%2.2s.%7.7s\n", date, date+2, date+4, date+6); 

Devrait marcher.

Au lieu de printf, vous pouvez utiliser sprintf et copier dans un tampon. Je vérifierais également la longueur correcte pour éviter un comportement imprévisible.

Dans les deux cas, le résultat sera:

 23:59:59.1234567