Strtok和String操作问题

#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 ,我正在获得我想要的部分内容。 .txt的前几行如下:

 #include "stdafx.h" #include  #include  #include  #define FLUSH while( getchar()!= '\n') 

现在,在它运行我的代码后,它将其变为:

 include include include include define FLUSH while 

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

 include include include include define FLUSH while 

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

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

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

此外,你没有添加 (空格)到您的令牌列表,因此它不会在空格上分割。