web-dev-qa-db-fra.com

Est-il possible d'imprimer uniquement une certaine section d'une chaîne de caractères sans créer de sous-chaîne distincte?

Dites que j'ai ce qui suit:

char* string = "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? Existe-t-il une variation de printf qui permettrait cela?

59
Tim

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

Oui, il suffit de passer un pointeur sur le cinquième au dernier caractère. Vous pouvez déterminer ceci par string + strlen(string) - 5.

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

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

#include <stdio.h>
#include <string.h>
char* string = "Hello, how are you?";

int main() {
  /* print  at most the first five characters (safe to use on short strings) */
  printf("(%.5s)\n", string);

  /* print last five characters (dangerous on short strings) */
  printf("(%s)\n", string + strlen(string) - 5);

  int n = 3;
  /* print at most first three characters (safe) */
  printf("(%.*s)\n", n, string);

  /* print last three characters (dangerous on short strings) */
  printf("(%s)\n", string + strlen(string) - n);
  return 0;
}
107
Robᵩ

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

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

Les cinq premiers peuvent être faits avec:

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

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", &(string[strlen (string) + 7]));

Vous do devez vous assurer que la chaîne est suffisamment longue pour que cela fonctionne. L'impression des cinq derniers caractères d'une chaîne d'un caractère entraînera un comportement indéfini car l'index se termine par -4. En d'autres termes, vérifiez la longueur de la chaîne avant d'essayer ceci.

20
paxdiablo

Deux solutions:

Donnons une chaîne prédéfinissable de même longueur - Je vais utiliser la date comme exemple et demander de la séparer en HH: MM: SS.DDDDDDDD

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 brève:

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 voudrais également vérifier la longueur correcte pour éviter un comportement imprévisible.

Dans les deux cas, le résultat sera:

23:59:59.1234567
0
Kapil Vyas