【问题标题】:C++ removing non-alphabetic chars from beginning of a word [closed]C ++从单词的开头删除非字母字符[关闭]
【发布时间】:2016-02-08 09:26:26
【问题描述】:

我在字符串类型的方法中有以下代码,该方法从文件中读取单词,从单词的开头删除所有非字母字符(如下所示)并在删除后返回它们。在 main 方法中打印出结果后,我注意到即使它应该从头开始删除所有非字母字符,它仍然总是打印出 1,例如: 该列表包含以下单词:

那里——曾经是一只可爱的——;小兔子被枪杀了,故事结束

应用函数后,输出为:

曾经有一只可爱的小兔子,他被枪杀了,故事结束

inFile >> word;
    for(int i=0; i<word.size(); i++){
        if(word[i] >= 'A' && word[i] <= 'Z' || word[i] >= 'a' && word[i] <= 'z')  break;
        else word.erase(i,1);
    }
    return word;

如果有人能告诉我到底是什么我没看到,我将不胜感激。我已经尝试了所有不同的功能,例如Erase()、isalpha() 等。它们在不应该的情况下都会产生相同的结果。我在做什么禁止删除最后一个非字母字符(在单词的开头)? 我尝试了同样的方法来删除单词末尾的所有标点符号,但它会删除除一个之外的所有标点符号(再次)。

感谢您的宝贵时间

【问题讨论】:

  • 与您的问题无关,但您确实知道std::isalpha函数?
  • 我实际上只是修复了它:p 没有注意到我没有将 i-- 放入擦除
  • @JoachimPileborg 是的,我愿意。我之前使用过它,但我忘记了问题出在我的循环值中,而不是我刚刚注意到的函数。 :)

标签: c++ iostream ifstream erase-remove-idiom


【解决方案1】:

您的循环会跳过字符,因为您删除了一个项目并继续。如果删除,则必须减少i,因为删除后下一个字母在同一位置。或者,您必须为每个位置设置一个 while 循环来擦除该位置,直到它变为 alpha 或 end,但减少 i 更简单,更不容易出错。

在调试器上运行代码会立即在逻辑中显示此问题。

【讨论】:

  • 我会接受你的回答,即使我在发布我需要做的问题后立即意识到 - 在擦除中。 :)
猜你喜欢
  • 2017-07-07
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多