使用 strtok 函数标记一个句子

using strtok function to tokenize a sentence

我在使用 strtok() 函数时遇到了一些问题。我想做的是从键盘上抓取一个句子,然后为句子中的每个 space 创建标记,然后最后打印由 space 分隔的每个单词。我当前的输出是空白的我有一种感觉与我的定界符有关但我不确定,任何反馈都会很好谢谢!

键盘输入示例:

The sky is really cool

输出示例:

the
sky 
is
really 
cool

到目前为止我的代码

   #define _CRT_SECURE_NO_WARNINGS
   #include<iostream>
   #include<string>
   using namespace std;

 int main(){
 char sent[99];
 int length = strlen(sent);

 cout << "Enter a Sentence" << endl;
 cin.getline(sent,99);
 char* tok = strtok(sent," ");
 int i = 0;

while (i<=length)
{
    tok = strtok(NULL, " ");
    cout << tok;
    i++;
}
system("pause");
}

到目前为止的输出

Enter a Sentence
the sky is really cool

                            Press any key to continue . . .

你根本不需要 length,因为如果 strtok() 找不到更多的分隔符,它会 return 一个空指针:

char* token = strtok(sent," ");
while (token != NULL) {
    std::cout << token << '\n';
    token = strtok(NULL, " ");
}

因为这是 C++ 标签,你也可以使用 istringstreamstd::string:

std::istreamstream is(sent);
std::string word;
while (is >> word) {
    std::cout << word << '\n';
}

您的代码中有几个问题需要解决:

  1. 您在 while 循环中使用的逻辑不正确。
  2. 您将错过打印第一个令牌的机会。

这是一个简化的 main:

int main(){
   char sent[99];

   cout << "Enter a Sentence" << endl;
   cin.getline(sent,99);
   char* tok = strtok(sent," ");
   while (tok != NULL) // Correct logic to use to stop looping.
   {
      cout << tok << endl;  // Print the current token before getting the next token.
      tok = strtok(NULL, " ");
   }
}