Strtok和字符串操作问题

时间:2016-03-12 17:26:01

标签: c string strtok

#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);
        }
    }
}

所以我传入一个包含示例程序的文件。我的工作是删除一些delims并将代码中的每个单词传递到树中。

虽然我不在树的一部分而只是按照我想要的方式操作字符串,但我遇到了一些问题。

因此,当我从.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

"<>中的字词被删除了,因为这些是一些delim。 我遇到的问题是define FLUSH while部分。如果一行不是一个单词而不是一个单词,我希望每个单词分别显示,输出:

include
include
include
include
define
FLUSH
while

正如您所看到的,define FLUSH while现在每个单词都在一个单独的行上。

我认为制作ptr=NULL会导致strtok重复使用该行,直到它结束,但我再次遇到一些麻烦。任何建议/帮助都会很棒。感谢。

1 个答案:

答案 0 :(得分:3)

问题在于您定义for循环的方式:

以下是代码的简化代码段:

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两次,但只打印一次?这意味着你将丢失所有其他令牌。

此外,您尚未将(空格)添加到令牌列表中,因此不会在空格上拆分。