如何使用strtok正确计算单词数?

时间:2018-11-27 18:37:10

标签: c string strtok

#include <stdio.h>
#include <string.h>

int main(void) {

  char tekst[10000], test=0;
  char* word;
  char word_copy[100][100];
  int i=0, lenght=0;

  printf("Type in your text: ");
  fgets(tekst, 10000, stdin);

  lenght=strlen(tekst)-1;
  if(lenght>1000)
  {
    lenght=1000;
  }

  word=strtok(tekst, " ,\".-");

  while( word != NULL)
    {
      word=strtok(NULL, " ,\".-");
      printf("%s ", word);
      i++;

    }

  printf("%d", i);

你好我想做的是仅通过使用strtok来计数单词。但是,如果我键入:“ example”或-example-,我得到的答案是“ 2”而不是“ 1”。出于某种原因,当最后一个单词为(null)时,它仍然会触发循环,并且i ++可以工作...我对编程很陌生,所以我也很想写下正确的代码。

2 个答案:

答案 0 :(得分:2)

从注释继续,这是修复代码的另一种方法:

...
char *text = tekst;
while((word = strtok(text, " ,\".-"))) {
    text = NULL;
    printf("%s ", word);
    i++;
}
...

答案 1 :(得分:0)

您要删除fgets()的尾随换行符,如Removing trailing newline character from fgets() input中所述。

然后,我删除了代码中未使用的内容,例如长度。

作为strtok()的{​​{3}}中的示例,您首先获取了令牌,然后再次调用该函数。使用这种方法,您不必担心将NULL算作一个单词(您的代码已经做到了)。

将所有内容放在一起,我们得到:

#include <stdio.h>
#include <string.h>

int main(void) {

  char tekst[10000];
  char* word;
  int i=0;

  printf("Type in your text: ");
  fgets(tekst, 10000, stdin);
  tekst[strcspn(tekst, "\n")] = 0;

  word=strtok(tekst, " ,\".-");

  while( word != NULL)
  {
      printf("%s ", word);
      word=strtok(NULL, " ,\".-");
      i++;

  }

  printf("%d", i);

  return 0;
}

输出(输入:“堆栈溢出”):

  

键入您的文本:堆栈溢出2


PS:reference返回不带空终止符的字符串长度,无需自己减去。