关于 c:Strtok 和字符串操作问题

Strtok and String manipulation issues

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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\
"
, word);
        }
    }
}

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

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

所以,当我从 .txt 文件中读取行时,我得到了我想要的部分内容。 .txt 的前几行如下:

1
2
3
4
5
6
#include"stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FLUSH while( getchar()!= '\
')

现在,在它运行完我的代码后,它变成了:

1
2
3
4
5
include
include
include
include
define FLUSH while

"<> 中的单词被删除,因为它们是一些分隔符。
我遇到的问题出在 define FLUSH while 部分。当一行作为多个不是分隔符的单词时,我希望每个单词单独显示,从而输出:

1
2
3
4
5
6
7
include
include
include
include
define
FLUSH
while

如您所见,define FLUSH while 现在将每个单词放在单独的行上。

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


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

这是代码的简化片段:

1
2
3
4
5
6
for (; word = strtok(ptr, DELIMS);ptr = NULL)
{
    word = strtok(ptr, DELIMS);
    printf("%s\
"
, word);
}

这相当于是:

1
2
3
4
5
6
7
while(word = strtok(ptr, DELIMS))
{
    word = strtok(ptr, DELIMS);
    printf("%s\
"
, word);
    ptr = NULL;
}

注意你如何在每次迭代中调用 strtok 两次,但只打印一次?这意味着您将丢失所有其他令牌。

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