如何正确地从 char 数组中删除一个字符(无论是否转换为字符串)?

新手上路,请多包涵

对于任何可能的重复问题,请提前道歉。我一直在谷歌搜索我的编译器错误的解决方案,一个星期以来,从这里的各种答案中尝试了不同的解决方法,但我不断收到一些错误。

我目前正在学习 C++,试图构建一个程序来处理元音/辅音计数、字母删除等基本内容。在我进入 自定义字母 删除部分之前,一切正常。基本上,使用字符函数(据我所知)几乎不可能做到这一点,而转换为字符串似乎会产生其他类型的错误。

这是我不断收到错误的代码片段:

 if (strcmp (service, key4) ==0)
{
string str(s);

cout<<endl<<"Please insert the letter you would like removed from your "<<phrasal<<":"<<endl;

cin>>letterToRemove;

s.erase(remove(s.begin(), s.end(),letterToRemove), s.end());

cout<<endl<<s<< "\n"<<endl;
}

这是我使用的初始化变量:

 int main()

{
char s[1000], phrasal[10], service[50], key1[] = "1", key2[] = "2", key3[] = "3", key4[] = "4", key5[] = "5", key6[] = "6", key0[] = "0", *p, letterToRemove;

int vowel=0, vowel2=0, consonant=0, consonant2=0, b, i, j, k, phrase=0, minusOne, letter, idxToDel;

void pop_back();

char *s_bin;

如您所见,原来 的 ’s’ 是一个 char 数组。在第一个代码示例中,我尝试将其转换为字符串数组( string str(s) ),但这会导致以下编译错误:

  • 错误:在 ’s’ 中请求成员 ‘erase’,它是非类类型 ‘char[1000]’
  • 错误:在 ’s’ 中请求成员 ‘begin’,它是非类类型 ‘char[1000]’
  • 错误:在“s”中请求成员“end”,它是非类类型“char[1000]”
  • 错误:在“s”中请求成员“end”,它是非类类型“char[1000]”

我尝试过的另一个解决方法是:

 if(strcmp(service, key4)==0)

{std::string s(s);

cout<<endl<<"Please insert the letter you would like removed from your "<<phrasal<<":"<<endl;

cin>>letterToRemove;

s.erase(remove(s.begin(), s.end(),letterToRemove), s.end());

cout<<endl<<s<< "\n"<<endl;
}

现在这是有趣的部分,我没有收到任何错误,但是一旦我选择 自定义字母删除 功能,调试就会崩溃。它是这样说的:

“在抛出 ‘std::length_error’ what() 的实例后调用终止:basic_string::_S_create 此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”

任何帮助将不胜感激,现在已经坚持了一周!

PS如果我或版主在回答完这个问题后删除这个问题可以吗?我很确定我不是第一个提出这个问题的人,但是,如前所述,即使在遵循类似问题的答案之后,我也会不断收到这些错误。

原文由 Eludium 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

对于 char 数组,您必须使用 std::remove 而不是 erase ,并手动插入空终止符:

 auto newEnd = std::remove(std::begin(s), std::end(s), letterToRemove);
*newEnd = '\0';

原文由 emlai 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题