2010-02-17 4 views
11

Je suis en train de supprimer les espaces d'une chaîne en C, pas de fin, ni le début, à plusieurs espaces dans une chaîneSupprimer les espaces d'une chaîne, mais pas au début ou à la fin

Par exemple

hello everyone this  is a test 

a deux espaces entre bonjour et tout le monde, et cinq espaces de ce à est. En fin de compte, je voudrais supprimer 1 espace du 2 et 4 du 5, de sorte que chaque espace a exactement 1 espace. Avoir du sens?

C'est ce que je vais faire:

  • créer un pointeur, le point à la chaîne à l'élément 1 char [0].

  • faire une boucle sur toute la longueur de la chaîne

  • alors ma logique est, si mon pointeur à [i] est un espace et mon pointeur à l'élément espace [i + 1], puis de faire quelque chose

Je ne suis pas tout à fait sûr de ce qui serait une bonne solution d'ici, en gardant à l'esprit que je n'utiliserai pas de fonctions pré-construites. Quelqu'un a-t-il une idée?

Répondre

4

Une façon est de le faire sur place. Boucle à travers la chaîne du début à la fin. stocker un pointeur d'écriture et un pointeur de lecture. Chaque boucle le pointeur d'écriture et le pointeur de lecture avance d'une unité. Lorsque vous rencontrez un espace, transférez-le comme d'habitude, puis bouclez le pointeur de lecture en incrémentant chaque fois jusqu'à ce qu'un non-espace soit trouvé (ou la fin de la chaîne, évidemment). N'oubliez pas d'ajouter un '\ 0' à la fin et vous avez maintenant la même chaîne sans les espaces.

0

Une partie difficile ici est que vous ne pouvez pas supprimer facilement un élément du tableau de caractères. Vous pourriez bien sûr faire une fonction qui retourne un char [] qui a un élément particulier supprimé. Une autre option consiste à créer un tableau supplémentaire qui indique les caractères que vous devez conserver et à passer par-dessus le char une fois de plus, en ne copiant que les caractères que vous voulez conserver.

2

Etes-vous autorisé à utiliser de la mémoire supplémentaire pour créer un doublon de la chaîne ou vous devez effectuer le traitement en place? Le plus simple sera d'allouer de la mémoire à la taille de la chaîne d'origine et de copier tous les caractères là-bas. Si vous rencontrez un espace supplémentaire, ne le copiez pas.

Si vous avez besoin de le faire, créez deux pointeurs. Un pointant vers le personnage en cours de lecture et un vers le personnage en cours de copie. Lorsque vous rencontrez un espace supplémentaire, adaptez le pointeur "read" pour qu'il pointe vers le caractère non-espace suivant. Copiez en position d'écriture le caractère pointé par le caractère lu. Puis avancez le pointeur de lecture sur le caractère après le caractère à copier. Le pointeur d'écriture est incrémenté de un, chaque fois qu'une copie est effectuée.

Exemple:

  write 
      V 
xxxx_xxxx__xxx 
     ^
      Read 
+0

wow - très instructif, merci beaucoup – leo

+0

Votre méthode (la même que la mienne) fonctionne tout aussi bien sur place vous réalisez :) – Goz

+0

vraiment, alors j'étais presque là alors? : D - Bravo Goz – leo

0

Ceci est basé sur ce que Goz a dit, mais je pense qu'il a eu du mal doigt, parce que je suis sûr de ce qu'il décrit dépouillerait tous les espaces (pas seulement la seconde partir de chaque course).

EDIT - oups - erreur à propos de Goz, même si le libellé "supplémentaire" ne couvrirait correctement que deux passages.

EDIT - oups - solution pré-écrite enlevé ...

L'idée générale, cependant, est d'utiliser le « de » et « à » pointeurs comme les autres, mais aussi de conserver certaines informations (état) d'une itération à l'autre afin que vous puissiez décider si vous êtes déjà dans une série d'espaces ou non.

+0

ne vous inquiétez pas je ne vais pas l'utiliser de toute façon, j'aime l'idée de l'écriture lire l'idée ci-dessus, pas sûr si cela utilisé, anwyays il ne compte plus maintenant comme son disparu;) – leo

+0

@leo - Goz et kgiannakakis ont définitivement donné un bon point de départ. Neil a raison, cependant, et j'ai écrit assez de plaintes similaires que je suis très rouge-face en ce moment :-( – Steve314

0

Vous pouvez faire une recherche et remplacer pour "  " et " ", et continuer à le faire jusqu'à ce que plus de correspondances sont trouvées. Innefficient, mais logique.

Questions connexes