【问题标题】:How to remove a specific keyword from a given user input?如何从给定的用户输入中删除特定关键字?
【发布时间】:2020-11-02 06:43:50
【问题描述】:

我正在开发一个需要用户输入两次的程序。用户将输入一个句子,然后输入一个关键短语以删除整个句子中找到的每个匹配项,并返回剩下的内容。我在下面的“逻辑”代码是...

 char delim[AFFIX];
 strcpy(delim, userInput);                   //storing the phrase user wants to remove
 char *token = strtok(sentence, delim);     
    while (token)
    {
        cout << token << endl;
        token = strtok(NULL, delim);
    }
    

我遇到的问题是 strtok 会删除找到的每个字符实例。例如,如果用户希望删除“pre”的所有实例,那么单词“preformed”将变成“fo m d”而不是formed。有没有办法限制 strtok 删除找到的每个字符实例,而只删除一系列字符?

我知道使用字符串或向量会使我的生活更轻松,但我想使用字符数组。如果这还不够清楚,我真的很抱歉,我对 c++ 很陌生。任何有关如何解决此问题的建议将不胜感激。感谢您的宝贵时间。

【问题讨论】:

  • strtok() 旨在以这种方式工作。我建议仅将strtok() 与分隔符的第一个字符一起使用(在本例中为p)。然后在找到每个字符后,将该点的原始字符串与分隔符字符串进行比较。
  • 您可以使用strstrsentence 中查找delim 的下一个匹配项。但是,是的,std::string 会让你的生活更轻松 ;)

标签: c++ arrays char strtok


【解决方案1】:

一个简单且或多或少肮脏的解决方案是在搜索词前后添加空格。确保它实际上是一个完整的单词而不是单词的一部分。

例如:

  • 输入:“前”
  • 检查:“pre”

为确保您还剪切了第一个单词,您需要检查字符串的第一部分,如果第一个单词也是输入的单词,则在其前面添加一个空格。

示例:

#include <string>
#include <iostream>

void removeSubstrs(std::string& s, std::string& p) { 
  std::string::size_type n = p.length();
  for (std::string::size_type i = s.find(p);
      i != std::string::npos;
      i = s.find(p))
      s.erase(i, n);
}

void check(std::string& s, std::string& p) {
   int slen = s.length();
   int plen = p.length();
   std::string firstpart = s.substr (0,plen);
   std::string lastpart = s.substr (slen-plen,slen);
   if (firstpart == p) {
       s = " " + s;
   }
   if (lastpart == p) {
       s += " ";
   }
}

int main ()
{
  std::string str = "pre test inppre test pre";
  std::string search = "pre";
  std::string pattern = " " + search + " ";
  
  check(str, search);
  removeSubstrs(str, pattern);
  std::cout << str << std::endl;

  return 0;
}

【讨论】:

    【解决方案2】:

    strtok 在这里不是正确的选择,您可以将 strtok 的第二个参数视为分隔符列表(该列表中的每个字符都是一个分隔符),它使用这些分隔符将字符串分解为标记。 更好的解决方案是类似于 strstr 和 strcat。 可能是这样的(使用 MSVC++)

    void removeSubstr(char *string, const char *sub, int n) {
        char *match;
        int len = strlen(sub);
        while ((match = strstr(string, sub))) {
            *match = '\0';
            strcat_s(string, n, match + len);
        }
    }
    
    int main() {
        char test[] = "abcxyz123xyz";
        removeSubstr(test, "xyz", sizeof(test) / sizeof(char));
        cout << test << endl;
    }
    

    strcat_s 是 strcat 的更安全版本(MSVC++ 比 strcat 更喜欢它:p) 有更好的方法来做这个 ofc,但我按照你的要求将自己限制在 char 数组中......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2011-07-09
      相关资源
      最近更新 更多