2016-03-12 5 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); 
     } 
    } 
} 

Итак, я передаю файл, в котором есть образец программы. Моя задача - удалить некоторые разделители и передать каждое слово из кода в дерево.Проблемы с манипуляциями Strtok и String

Хотя я не на части дерева и просто работаю над тем, чтобы заставить струны манипулировать так, как я хочу, у меня возникают некоторые проблемы.

Итак, когда я прочитал строки из файла .txt, я получаю часть того, что хочу. Первая пара строк из .txt выглядит следующим образом:

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

Теперь, после того, как она проходит через мой код, он превращает ее в

include 
include 
include 
include 
define FLUSH while 

Слова в " и <> удаляется, так как те, это несколько из делимов. Проблема, которую я испытываю, находится в части define FLUSH while. Когда строка в более чем одно слово, которое не является DELIM, я хочу, каждое слово, которое будет отображаться отдельно, делая вывод:

include 
include 
include 
include 
define 
FLUSH 
while 

Как вы можете видеть, define FLUSH while теперь каждое слово на отдельной строке.

Я думал, что создание ptr=NULL приведет к тому, что strtok будет использовать линию до тех пор, пока она не дойдет до конца, но снова у меня возникли проблемы с этим. Любые советы/помощь будут замечательными. Благодарю.

+0

Что такое '' 'DELIMS''' как? –

+0

@TomCarpenter сожалеет об этом, добавлен в код. – Bryan

+1

Вы знаете, что ['strtok'] (http://en.cppreference.com/w/c/string/byte/strtok) использует' NULL', чтобы первый параметр продолжал токенизировать текущий буфер (в вашем случай, каждая строка читается), правильно? – WhozCraig

ответ

3

Вопрос в том, как вы определили ваш цикл:

Вот упрощенный фрагмент кода:

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

Что это эквивалентно является:

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

Обратите внимание, как вы дважды вызываете strtok на каждой итерации, но только один раз печатаете? Это означает, что вы потеряете все остальные токены.

Кроме того, вы не добавили (пробел) в свой список токенов, поэтому он не будет разбиваться на пробелы.

+0

Итак, если delims теперь: '#define DELIMS"! \ "# $% &() | '* +,?/:; <=> @ [\ 092]^_ {} ~ \ 177 \ 040 \ t "' и удаляя strtok, должен помочь – Bryan

+0

@Bryan вы можете использовать '' '\ 040''' или просто поместить пробел, например' '' #define DELIMS '! \ "# $% &() |' * +,?/:; <=> @ [\ 092]^_ {} ~ \ 177 \ t" '' ' –

+0

Ну, это пропущение было королем помогая ... что-нибудь в таких разделителях, как 'stdio.h', должно быть удалено, а не показано/добавлено в дерево ... Мой плохой я должен был сказать, что в начале – Bryan

Смежные вопросы