Supprimer l'espace blanc supplémentaire à partir de l'intérieur d'une chaîne C?
J'ai lu quelques lignes de texte dans un tableau de C-strings. Les lignes ont un nombre arbitraire de tabulation ou un espace délimité par des colonnes, et je suis à essayer de comprendre comment faire pour supprimer les espaces entre eux. L'objectif final est d'utiliser strtok pour briser les colonnes. C'est un bon exemple des colonnes:
Cartwright Wendy 93 Williamson Marque 81 Thompson Marque 100 Anderson John 76 Dennis Turner 56
Comment puis-je éliminer l'un des espaces ou des tabulations entre les colonnes de sorte que la sortie ressemble à ceci?
Cartwright Wendy 93
Sinon, puis-je remplacer tous les espaces entre les colonnes avec un caractère différent afin d'utiliser strtok? Quelque chose comme ceci?
Cartwright#Wendy#93
edit: Plusieurs grandes réponses, mais fallait bien en choisir un. Merci pour l'aide de tous.
OriginalL'auteur jergason | 2009-09-22
Vous devez vous connecter pour publier un commentaire.
Si je peut entendre la voix de "vous faites mal" opinion", pourquoi ne pas simplement éliminer les espaces lors de la lecture? Utilisation
fscanf("%s", string);
lire un "mot" (sans les espaces), puis lecture de l'espace. Si ce sont des espaces ou des tabulations, continuez à lire dans une "ligne" de données. Si c'est un retour à la ligne, créer une nouvelle entrée. Il est probablement plus facile en C pour obtenir les données dans un format que vous pouvez travailler dès que possible, plutôt que d'essayer de faire de lourds manipulation de texte.Si vous savez que vous allez être la lecture d'un nombre fixe de colonnes, vous pourriez faire une liste liée structure nommée entrées pour chaque colonne. Si vous ne le faites pas, vous pourriez encore envie d'encapsuler les données dans une liste liée à la structure pour garder une trace du nombre d'entrées. Ou vous pouvez utiliser un tableau dynamique, mais sachez que vous aurez à passer autour de la taille de la matrice partout où vous allez (vous avez probablement été mis en garde à propos d'un million de fois déjà si vous n'avez jamais rien lu sur C).
Il n'y a rien de mal avec les langages de script. Ma langue maternelle est le Perl et je suis actuellement en étirant mon Python, mais j'aime bien C ainsi. Il est bon d'apprendre le C, parce que vous apprendre à faire les choses d'une nouvelle façon. Il a presque fait mon Perl illisible parce que je voulais traiter le texte un caractère à la fois avec
getc()
pendant environ une heure jusqu'à ce que je me suis souvenu combien il était plus facile de le faire de la façon dont Perl veut que vous.Attention pour dépassement de la mémoire tampon à l'aide de fscanf.
En écho @Robert, utilisez
fgets
en conjonction avecsscanf
.OriginalL'auteur Chris Lutz
Pourquoi ne pas utiliser
strtok()
directement? Pas besoin de modifier l'entréeTout ce que vous devez faire est de répéter
strtok()
jusqu'à ce que vous obtenez 3 non-espace de jetons et vous avez terminé!Il arrive aux meilleurs d'entre nous mate 😉 voir mon commentaire sur Alex Martelli réponse, j'ai dit exactement la même chose lol
OriginalL'auteur hhafez
Modifier: j'ai d'abord eu un malloced espace de travail, j'ai bien peut être plus clair. Cependant, le faire w/o de la mémoire supplémentaire est presque aussi simple, et je suis poussé dans les commentaires et les personnels de l'IMs, donc, vient ici...:-)
parce que vous allouer la mémoire, comment?
Je veux dire à l'aide de malloc. Peut être fait à la place...
Vrai 🙂 n'avait pas pensé à ça
Il est possible de simplement remplacer la ligne existante (assurez-vous d'ajouter la clôture
'\0'
!-), J'ai juste pensé que je devais rendre les choses plus simples pour les OP. Si l'OP commentaires et/ou corrections (mieux: 😉 pour demander "aucun auxiliaire de mémoire à allouer", je vais modifier la réponse en conséquence.OriginalL'auteur Alex Martelli
Le code suivant modifie la corde en place; si vous ne voulez pas détruire votre entrée, vous pouvez passer un deuxième tampon pour recevoir la chaîne modifiée. Devrait être assez explicite:
OriginalL'auteur John Bode
OriginalL'auteur Jean-Francois Desgagné
Vous avez pu lire une ligne puis de le scanner pour trouver le début de chaque colonne. Ensuite utiliser les données de la colonne toutefois vous le souhaitez.
Note, le code pourrait encore utiliser certaines robuste-ification: vérifier pour les erreurs de fichiers w/ferror; assurer expressions du folklore a été frappé w/feof; s'assurer de la totalité de l'enregistrement (toutes les données de la colonne) a été traitée. Il pourrait également être plus souple en utilisant une liste liée au lieu d'un tableau fixe et pourrait être modifié afin de ne pas assumer chaque colonne ne contient qu'un seul mot (tant que les colonnes sont séparées par un caractère spécifique).
OriginalL'auteur Robert Groves
Voici une autre fonction qui éclate en répétées de l'espace de caractères, tel que défini par
isspace()
dans<ctype.h>
. Il renvoie la longueur de la 'squidged' string.OriginalL'auteur Jonathan Leffler
J'ai fait une petite amélioration sur John Bode pour retirer de fuite espaces ainsi:
br.
OriginalL'auteur Alexis RODET
Le code suivant suffit de caractères d'entrée sage, puis vérifier pour chaque personnage, si il y a d'espace, plus d'une fois il l'ignore autre chose, elle imprime le caractère.
Même logique que vous pouvez utiliser pour onglet.
Espérons que cela aide dans la résolution de votre problème. Si il ya un problème avec ce code s'il vous plaît laissez-moi savoir.
OriginalL'auteur K86