Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从给定的用户输入中删除特定关键字?_C++_Arrays_Char_Strtok - Fatal编程技术网

C++ 如何从给定的用户输入中删除特定关键字?

C++ 如何从给定的用户输入中删除特定关键字?,c++,arrays,char,strtok,C++,Arrays,Char,Strtok,我正在开发一个程序,它需要用户输入两次。用户将输入一个句子,然后输入一个关键短语,以删除整个句子中找到的每个匹配项,并返回剩下的内容。我下面的“逻辑”代码是 char delim[AFFIX]; strcpy(delim, userInput); //storing the phrase user wants to remove char *token = strtok(sentence, delim); while (token)

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

 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);
    }
    
chardelim[粘贴];
strcpy(delim,userInput)//存储用户要删除的短语
char*token=strtok(句子,delim);
while(令牌)
{

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

例如:

#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;
}
  • 输入:“预”
  • 检查:“预”
为了确保剪切第一个单词,您需要检查字符串的第一部分,如果第一个单词也是输入的单词,则需要在其前面添加空格

示例:

#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;
}
#包括
#包括
void removeSubstrs(std::string&s,std::string&p){
std::string::size_type n=p.length();
对于(std::string::size_type i=s.find(p);
i!=std::string::npos;
i=s.find(p))
s、 擦除(i,n);
}
无效检查(标准::字符串&s,标准::字符串&p){
int slen=s.length();
int plen=p.长度();
std::string firstpart=s.substr(0,plen);
std::string lastpart=s.substr(slen plen,slen);
如果(第一部分==p){
s=”“+s;
}
if(lastpart==p){
s+=”;
}
}
int main()
{
std::string str=“pre test inpre test pre”;
std::string search=“pre”;
std::string pattern=“”+搜索+”;
检查(str,搜索);
removeSubstrs(str,模式);

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

void removeSubstr(char*string,const char*sub,int n){
字符*匹配;
int len=strlen(sub);
while((match=strstr(string,sub))){
*匹配='\0';
strcat_s(字符串,n,匹配+len);
}
}
int main(){
字符测试[]=“abcxyz123xyz”;
移除SUBSTR(测试,“xyz”、sizeof(测试)/sizeof(字符));
cout
strtok()
就是这样设计的。我建议只使用
strtok()
和分隔符的第一个字符(在本例中是
p
)。然后对找到的每个字符,将该点的原始字符串与分隔符字符串进行比较。您可以使用它在
语句中查找下一个出现的
delim
。但是,是的,
std::string
会让您的生活更轻松;)