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(字符));
coutstrtok()
就是这样设计的。我建议只使用strtok()
和分隔符的第一个字符(在本例中是p
)。然后对找到的每个字符,将该点的原始字符串与分隔符字符串进行比较。您可以使用它在语句中查找下一个出现的delim
。但是,是的,std::string
会让您的生活更轻松;)