Faire fscanf Ignorer le Paramètre Facultatif
Je suis en utilisant fscanf pour lire un fichier qui a des lignes comme
Nombre <-blanc-> string <-blanc-> optional_3rd_column
Je souhaite extraire la chaîne et nombre de chaque colonne, mais ignorer la 3rd_column si il existe
De Données, Par Exemple:
12 foo quelque chose
03 bar
24 quelque chose #randomcomment
Je voudrais extraire 12,foo; 03,bar; le 24, à quelque chose tout en ignorant le "quelque chose" et "#randomcomment"
J'ai actuellement quelque chose comme
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
Toutefois, cela ne fonctionne pas avec des lignes avec pas de 3ème colonne. Comment puis-je faire ignorer tout ce qui est après la 2ème chaîne de caractères?
OriginalL'auteur Aditya Mukherji | 2008-10-29
Vous devez vous connecter pour publier un commentaire.
Il semble à moi que la solution la plus simple est de scanf("%d %s", &num &mot) et puis fgets() pour manger le reste de la ligne.
OriginalL'auteur Artelius
Le problème est que le
%*s
est de manger de la nombre sur la ligne suivante quand il n'y a pas de troisième colonne, et puis la prochaine%d
est un échec parce que le prochain jeton n'est pas un nombre. Pour le fixer, sans l'aide degets()
suivie parsscanf()
, vous pouvez utiliser la classe de caractères spécifié:La
[^\n]
dit de faire correspondre autant de caractères que possible qui ne sont pas des retours à la ligne, et le*
supprime l'affectation comme avant. Notez également que vous ne pouvez pas mettre un espace entre le%s
et la%*[\n]
, parce que sinon, que de l'espace dans la chaîne de format correspondent à la ligne, provoquant la%*[\n]
pour correspondre à l'ensemble de la ligne suivante, qui n'est pas ce que vous voulez.OriginalL'auteur Adam Rosenfield
Utiliser fgets() pour lire une ligne à la fois et ensuite utiliser sscanf() pour rechercher les deux colonnes qui vous intéressent, plus robuste et vous n'avez pas à faire quelque chose de spécial à ignorer de fuite de données.
Je ne suis pas sûr de comprendre, sscanf fonctionne à peu près le même que scanf n', à savoir qu'il va retourner le nombre d'éléments adaptés de sorte que vous pouvez utiliser la même logique, c'est à dire while (fgets(buf, taille, stdin) != NULL && sscanf(buf, "%d %s", &num &mot) == 2) { affecter des trucs }.
OriginalL'auteur Robert Gamble
J'ai souvent utiliser gets (), suivie par un sscanf() sur la chaîne que vous venez, er, gots.
Bonus: vous pouvez séparer le test de fin de saisie à partir de l'analyse syntaxique.
OriginalL'auteur Adam Liss