【问题标题】:Strtok and ability to ignore usernames?Strtok 和忽略用户名的能力?
【发布时间】:2018-02-22 01:51:42
【问题描述】:

所以我目前正在做一个项目,我们需要按单词解析句子(更具体地说是推文)并将单词的频率和单词本身存储在向量对中(使用自定义查找函数来增加频率)。

我目前正在使用 strtok 来解​​析句子,我想知道您是否可以忽略开头带有符号 @ 的任何单词。我目前将 strtok 函数的分隔符作为一堆无用的符号和空格!@#&()–[{}]:;',?/*\".+\\^ 并正确忽略它们,但说我有一个词:@thisismyusername,有没有办法忽略整个词,包括'thisismyusername' 而不仅仅是@

我一直在寻找类似这样的文档,但还没有找到任何东西。

这是我的 strtok 解析代码:

char* tempMap;
tempMap = strtok (tempHolderPos," !@#&()–[{}]:;',?/*\".+\\^");

*tempHolderPos是完整的句子。

谢谢大家!

【问题讨论】:

  • 我认为分割空格和分割的任何第一个字符不是字母更容易,不要隐藏它。
  • strtok是一个很原始的函数,更复杂的解析看regex

标签: c++ strtok


【解决方案1】:

您完全可以做到这一点。例如,以下内容将适用于您的 strtok 循环:

someloop {
    ptr = strtok (NULL, yourdelims); 
    if (*ptr == '@')
        continue;` 
    ...
}

strtok 获取令牌后,您只需检查第一个字符是否为'@',如果是,则在此时获取下一个单词——实际上忽略以'@' 开头的单词。

回想一下,当您取消引用字符指针时,您会得到字符本身。当在char * 变量名(指针的起始地址)上调用时,您会得到第一个字符。因此,您只需取消对指向令牌的指针的引用并检查第一个字符是否为 '@',如果是,则获取下一个单词,跳过将对令牌进行的所有其他处理。

【讨论】:

  • 太棒了,我必须添加 ptr = strtok (NULL, yourdelims); 才能将其移至下一个单词,但现在效果很好。谢谢!
  • 哦,是的,抱歉,这假定在进入循环之前之前调用了 ptr = strtok (yourstring, yourdelms);。很高兴你成功了。
【解决方案2】:

查看strtok 参考,我认为您不能直接这样做。忽略以@ 开头的任何标记并继续而不保存它会很容易。

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多