0 votes

Tampon d'analyse C - Avancer le tampon au-delà de l'espace blanc, stocker le mot.

Cela fait longtemps que je n'ai pas travaillé avec le code d'analyse des chaînes de caractères de la bibliothèque C standard (sprintf, atoi, etc.).

Mon besoin spécifique actuel est le suivant :

advance_buf( const char*& buf, const char* removed_chars, int size );

Elle devrait faire avancer le buf pour dépasser le groupe d'espaces blancs et copier les caractères supprimés dans le fichier removed_chars ... Le site size est de garder les choses en sécurité.

Exemple avant et après, état de buf y removed_chars :

  • Avant : buf : "123 456 789", removed_chars : (vide ou poubelle).
  • Après : buf : "456 789", removed_chars : "123".

Je suis également intéressé par une ressource succincte pour les fonctions de ce type.

1voto

Michael Foukarakis Points 14892

On dirait que strtok() et les amis peuvent faire le travail que vous voulez.

1voto

unwind Points 181987

Cela devrait être trivial :

const char * advance_buf(const char *buf, char *removed_chars, size_t size)
{
  /* Copy characters until whitespace found or buffer space runs out. */
  while(!isspace(*buf) && --size > 0)
    *removed_chars++ = *buf++;
  *removed_chars = '\0';

  /* Remove separating whitespace. */
  while(isspace(*buf))
    buf++;
  return buf;
}

J'ai changé un peu la signature, pour renvoyer la mise à jour buf pointeur.

1voto

finnw Points 24592

Pourquoi pas :

#define SPACE " \t"

const char *advance_buf(const char *buf, char *removed_chars, int size)
{
    buf += sprintf(removed_chars, "%.*s", min(size - 1, strcspn(buf, SPACE)), buf);
    return buf + strspn(buf, SPACE);
}

Remarque : si removed_chars se remplit, les caractères excédentaires seront no être retiré de buf .

const char *buf = "123 456789 X"
char removed_chars[5];

// Before: buf: "123 456789 X", removed_chars: (empty).
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "456789 X", removed_chars: "123".
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "89 X", removed_chars: "4567".

Note 2 : Bien que le sprintf est sûr car l'appel "%.*s" protège contre le dépassement de la mémoire tampon, certains compilateurs modernes génèrent des avertissements en cas de tout l'utilisation de sprintf() et les normes de codage de certaines entreprises l'interdisent. Si c'est le cas, il devrait être trivial de le remplacer par snprintf o sprintf_s .

0voto

Chris Lutz Points 34157

Je vous recommande de jeter un coup d'œil à la strspn() y strcspn() fonctions. La fonction suivante vous indique combien de caractères il reste avant le prochain espace blanc :

strcspn(string, " \t");

Et ce qui suit vous indiquera la longueur d'un morceau d'espace blanc :

strspn(string, " \t");

Vous pouvez utiliser ces chiffres pour effectuer cette tâche assez facilement, et probablement en toute sécurité si vous en avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X