2016-03-12 3 views
0
#define DELIMS "!\"#$%&()|'*+,?/:;<=>@[\092]^_{}~\177" 

void getFileLine(FILE *fp) 
{ 

    char *word, *ptr; 
    int tokennum, count; 
    char buffer[100]; 


    while(!feof(fp)) 
    { 
     (fgets(buffer, 100, fp)); 
     ptr = buffer; 
     for(tokennum = 1; word = strtok(ptr, DELIMS);ptr = NULL, tokennum++) 
     { 
      word = strtok(ptr, DELIMS); 
      printf("%s\n", word); 
     } 
    } 
} 

Je passe donc un fichier contenant un exemple de programme. Mon travail consiste à enlever quelques delims et à passer chaque mot du code dans un arbre.Problèmes de manipulation de Strtok et String

Même si je ne suis pas dans la partie arborescente et que je ne fais que travailler sur la manipulation des cordes comme je le souhaite, j'ai quelques problèmes. Donc, en lisant les lignes du fichier .txt, je reçois une partie de ce que je veux. Les deux premières lignes du .txt est la suivante:

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define FLUSH while(getchar()!= '\n') 

Maintenant, après son exécution par mon code, il le transforme en:

include 
include 
include 
include 
define FLUSH while 

Les mots " et <> sont supprimés car les sont quelques-uns des delims. Le problème que j'ai est à la partie define FLUSH while. Lorsqu'une ligne comme plus d'un mot qui n'est pas delim, je veux chaque mot à afficher séparément, ce qui rend la sortie:

include 
include 
include 
include 
define 
FLUSH 
while 

Comme vous pouvez le voir, le define FLUSH while a maintenant chaque mot sur une ligne distincte.

Je pensais que faire ptr=NULL amènerait le strtok à réutiliser la ligne jusqu'à la fin, mais encore une fois j'ai un peu de mal à le faire. Tout conseil/aide serait génial. Merci.

+0

Que définit '' '' DELIMS''' comme? –

+0

@TomCarpenter désolé à ce sujet, ajouté au code. – Bryan

+1

Vous savez que ['strtok'] (http://en.cppreference.com/w/c/string/byte/strtok) utilise' NULL' pour que le premier paramètre continue de marquer le tampon courant (dans votre cas, chaque ligne lue), non? – WhozCraig

Répondre

3

La question est la façon dont vous avez défini votre boucle:

Voici un extrait simplifié du code:

for (; word = strtok(ptr, DELIMS);ptr = NULL) 
{ 
    word = strtok(ptr, DELIMS); 
    printf("%s\n", word); 
} 

Ce que cela équivaut à est:

while(word = strtok(ptr, DELIMS)) 
{ 
    word = strtok(ptr, DELIMS); 
    printf("%s\n", word); 
    ptr = NULL; 
} 

Notez comment vous appelez strtok deux fois dans chaque itération, mais seulement imprimer une fois? Cela signifie que vous perdrez tous les autres jetons.

De plus, vous n'avez pas ajouté (espace) à votre liste de jetons, donc il ne sera pas divisé sur les espaces.

+0

Donc si les delims sont maintenant: '#define DELIMS"! \ "# $% &() | '* +,?/:; <=> @ [\ 092]^_ {} ~ \ 177 \ 040 \ t "' et en supprimant le strtok, devrait aider – Bryan

+0

@Brian vous pouvez utiliser '' '\ 040''' ou simplement mettre un espace. '' #define DELIMS "! \" # $% &() | '* +,?/:; <=> @ [\ 092]^_ {} ~ \ 177 \ t "' '' –

+0

Bien que sauter était roi de aider ... tout ce qui est dans les délimiteurs comme 'stdio.h' est censé être enlevé et non montré/ajouté à l'arbre ... Mon mauvais j'aurais dû le dire au début – Bryan