Comment dois-je analyser les champs séparés par des virgules chaîne à l'aide de sscanf, tout en soutenant des champs vides?
J'ai une chaîne séparée par des virgules, qui peuvent contenir des champs vides. Par exemple:
1,2,,4
À l'aide d'une base
sscanf(string,"%[^,],%[^,],%[^,],%[^,],%[^,]", &val1, &val2, &val3, &val4);
Je reçois toutes les valeurs avant le champ vide, et des résultats inattendus de la zone vide à partir.
Lorsque je retire l'expression pour le champ vide de la sscanf(),
sscanf(string,"%[^,],%[^,],,%[^,],%[^,]", &val1, &val2, &val3, &val4);
tout fonctionne bien.
Car je ne sais pas quand je vais avoir un champ vide, est-il un moyen de réécrire l'expression de manipuler les champs vides avec élégance?
OriginalL'auteur Belrog | 2009-10-02
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez
strtok
avec la virgule comme votre caractère séparateur, vous obtiendrez une liste de chaînes, l'un ou plusieurs de ce qui sera null/longueur zéro.Jeter un oeil à mon réponse ici pour plus d'informations.
il semble que
sscanf
'compteur interne coincé si la chaîne contient des,,
. Afin de mieux utiliserstrtok
.J'espérais vraiment ne pas avoir à le faire. J'ai une longue liste de valeurs de types différents (chars/ints/flotteurs). Que signifierait un champ de compteur et d'une grande instruction switch pour attribuer correctement. soupir
strtok est maintenant obsolète, utilisez strsep à la place. manpagez.com/man/3/strsep
OriginalL'auteur ChrisF
l'homme sscanf:
(italiques ajoutés).
OriginalL'auteur Sinan Ünür
Cela ressemble vous êtes actuellement aux prises avec CSV valeurs. Si vous avez besoin de l'étendre à la poignée de la cité de cordes (de sorte que les champs peuvent contenir des virgules, par exemple), vous trouverez que la
scanf
de la famille ne peut pas gérer toutes les complexités de la format. Ainsi, vous aurez besoin d'utiliser un code spécifiquement conçu pour gérer (votre variante de) CSV format.Vous trouverez une discussion d'un ensemble CSV bibliothèque implémentations dans ' La Pratique de la Programmation ' en C et C++. Pas de doute, il y a beaucoup d'autres sont disponibles.
OriginalL'auteur Jonathan Leffler
scanf()
renvoie le nombre d'éléments affectés. Peut-être que vous pouvez utiliser cette info ...Pouah! Et c'est seulement pour 1 valeur manquante
Comme cela a été souligné par d'autres réponses, vous êtes beaucoup mieux l'analyse de la chaîne dans le "comme d'habitude":
fgets()
etstrtok()
.OriginalL'auteur pmg
Voici ma version de scan séparées par des virgules, les valeurs int. Le code de détecter les vides et non des champs de type entier.
Résultat:
OriginalL'auteur sambowry
Mettre un '*' après le '%' pour sauter la lecture. En outre, il est possible de ne lire que 3 personnages en notant '%3' par exemple.
OriginalL'auteur hanoo
Je suis venu ici à la recherche de réponses à la même question. Je ne voulais pas quitter la fonction scanf.
En fin de compte, j'ai construit un zsscanf moi, où j'ai analysé le format, sscanf ed toutes les données un par un et vérifier le retour de sscanf pour voir si j'ai eu un vide de lire en toute. C'était un peu mon cas particulier: je voulais seulement certains champs, dont certains pourraient être vide, et ne pouvait pas assumer le séparateur.
De sortie:
Être averti, il n'est pas entièrement testé et a de sérieuses limites (les plus évidentes: n'accepte que les
%...s
,%...c
,%...[...]
et nécessite des séparateurs d'%...[...]
; sinon j'aurais vraiment dû se soucient de la chaîne de format, de cette façon, je ne se soucient%
).OriginalL'auteur dmcontador
J'ai dû modifier ce code un peu pour fonctionner correctement:
et la sortie:
OriginalL'auteur xerostomus
J'ai fait une modification pour délimités par des tabulations TSV fichiers, j'espère que ça peut aider:
Et la sortie:
OriginalL'auteur xerostomus
Il y a quelques problèmes avec strtok() répertoriés ici: http://benpfaff.org/writings/clc/strtok.html
Par conséquent, il est préférable de éviter strtok.
Maintenant, considérons une chaîne de caractères contenant un champ vide comme suit:
Vous pouvez utiliser fonction simple pour être en mesure convertit une Chaîne au format CSV afin de les lire sur un float Array:
Vous trouverez les Utilisation ci-dessous:
Sortie est comme suit :
OriginalL'auteur Sashank Bhogu