#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
重复使用该行,直到它结束,但我再次遇到一些麻烦。任何建议/帮助都会很棒。感谢。
答案 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
两次,但只打印一次?这意味着你将丢失所有其他令牌。
此外,您尚未将(空格)添加到令牌列表中,因此不会在空格上拆分。