7
votes

String String.Trim () en C

DUPLICATES possibles:

moyen indolore de couper le meneur / Espace de traînée en C?
couper une chaîne en C

J'écris la méthode de garniture à cordes en C et c'est le code que j'ai proposé. Je pense que le travail d'élimination des espaces de tête et de fuite des espaces de fin, je souhaite que le code puisse être plus propre. Pouvez-vous suggérer des améliorations? xxx

Ce code a-t-il l'air propre ??


4 commentaires

Eh bien, il ne vérifie que le caractère espace . L'espace blanc consiste généralement à vérifier l'onglet, le retour de chariot et l'alimentation en ligne


Stackoverflow.com/ Questions / 122616 / ...


Publié une réponse ici: Stackoverflow.com/ Questions / 656542 / Trim-A-String-in-C / ...


sinon si (lastc! = '') Quand lastc n'est jamais asigné. Envisagez de poster à codereview.stackexchange.com


7 Réponses :


4
votes

Cela n'a pas l'air propre. En supposant que le premier caractère est un espace, vous utilisez lastc avec une valeur non définie. Vous quittez un espace à la fin (s'il y a un espace à la fin, quand il est touché C sera un espace et dernierc ne sera pas).

Vous ne terminez pas non plus la chaîne. En supposant que vous corrigeez le problème d'inaidification DIADC , vous transformerez "ABC" en "ABCBC", car il n'est pas raccourci à aucun moment.

Le code effondra également plusieurs espaces à l'intérieur de la chaîne. Ce n'est pas ce que vous avez décrit; est-ce le comportement souhaité?


0 commentaires

1
votes

Il y a plusieurs problèmes avec ce code. Il ne vérifie que l'espace. Pas des onglets ou des lignes neuves. Vous copiez toute la partie blanche de la chaîne. Et vous utilisez LastC avant de la définir.

Voici une version alternative (compilée mais non testée): xxx


0 commentaires

0
votes

Au lieu de comparer un caractère avec le caractère d'espace '', j'utiliserais la fonction "Isspace", que je crois est définie dans ctype.h.


0 commentaires

0
votes

Je ne sais pas de propreté, mais je trouve difficile de suivre. Si j'avais besoin de faire cela, j'y réfléchisais d'abord en deux phases:

  1. Découvrez le nombre de caractères à déposer du début, puis Memmove le reste de la chaîne (y compris le terminateur NULL) à l'adresse de départ. (Vous n'avez peut-être pas besoin du Memmove si vous êtes autorisé à retourner un pointeur de démarrage différent, mais si vous devez donc faire très attention à l'hygiène de la mémoire.)
  2. Déterminez combien de caractères à déposer de la (nouvelle) fin et définissez un nouveau terminateur NULL là-bas.

    Je pourrais alors regarder de plus près une solution d'un laissez-passer comme si vous semblez essayer de mettre en œuvre, mais seulement s'il y avait un problème de vitesse.

    D'ailleurs, vous voulez probablement utiliser Isspace () plutôt que de vérifier uniquement pour l'espace.


0 commentaires

1
votes

Il y a des problèmes: dernierc code> pourrait être utilisé non initialisé. Et vous pouvez utiliser A pour boucle au lieu d'une boucle de temps, par exemple. De plus, les fonctions de garniture / bande remplacent généralement des espaces, des onglets et de nouvelles lignes.

Voici une solution utilisant des pointeurs que j'ai écrites il y a tout à fait: p>

void trim(char *str)
{
    char *ptr = str;
    while(*ptr == ' ' || *ptr == '\t' || *ptr == '\r' || *ptr == '\n') ++ptr;

    char *end = ptr;
    while(*end) ++end;

    if(end > ptr)
    {
        for(--end; end >= ptr && (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n'); --end);
    }

    memmove(str, ptr, end-ptr);
    str[end-ptr] = 0;
} 


0 commentaires

1
votes

Voici ma solution.

court, simple, propre, commenté et légèrement testé.

Il utilise la fonction de classification "ISSPACE", vous permet de modifier facilement votre définition de "espace blanc "Pour être coupé. xxx


2 commentaires

Cela pourrait être dangereux lorsque Strlen (String) est 0.


Il y a plus à l'espace blanc que le caractère spatial



3
votes

Il rend souvent votre code plus lisible si vous utilisez une utilisation judicieuse des fonctions de la bibliothèque standard - par exemple, Isspace () et Memmove () sont particulièrement utiles ici: xxx


1 commentaires

Ai-je votre permission d'utiliser cela dans un logiciel commercial?