检查字符串在C ++中以什么数字结尾

时间:2009-02-11 19:13:26

标签: c++ string numbers integer

在C ++ MD2文件加载器中,我有很多帧,每个帧都有一个以数字结尾的名称,例如

  • stand0
  • stand1
  • 台上2
  • stand3
  • stand4
  • ...
  • stand10
  • stand11
  • run0
  • RUN1
  • RUN2

如果没有背后的数字,我如何得到字符串?例如将“stand10”改为“stand”的功能

5 个答案:

答案 0 :(得分:4)

只是为了表明另一种方式,反向迭代器:

string::reverse_iterator rit = str.rbegin();
while(isdigit(*rit)) ++rit;
std::string new_str(str.begin(), rit.base());

如果你有boost :: bind,你可以让你的生活更轻松

std::string new_str(str.begin(),
    std::find_if(str.rbegin(), str.rend(),
                 !boost::bind(::isdigit, _1)).base());

答案 1 :(得分:3)

<强>串:: find_last_not_of ( “0123456789”) 然后 的串:: SUBSTR()

为您提供最后一位非数字/数字的位置。只需要取所有前面的字符,这就是基本名称。

增加1,得到字符串末尾的数字序列的开头。

注意:没有错误检查或其他测试。

#include <string>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
   string test = "hellothere4";

   size_t last_char_pos = test.find_last_not_of("0123456789");
   string base = test.substr(0, last_char_pos + 1);

修改

当您的“基本名称”在最后有一个数字时,所有解决方案都存在问题。

例如,如果基本字符串是“base1”,那么您永远无法获得正确的基本名称。我假设你已经意识到了这一点。

或者我错过了什么?只要基本名称在后缀号码之前的末尾不能有数字,它就可以正常工作。

答案 2 :(得分:1)

C风格的做法:

从左侧开始逐个字符地逐字符号。当您读取数字时,请停止并将其标记为字符串的结尾。

char *curChar = myString;   // Temporary for quicker iteration.

while(*curChar != '\0') {   // Loop through all characters in the string.
    if(isdigit(*curChar)) { // Is the current character a digit?
        *curChar = '\0';    // End the string.
        break;              // No need to loop any more.
    }

    ++curChar;              // Move onto the next character.
}

答案 3 :(得分:1)

只需完成它,一个使用find_first_of:

string new_string = str.substr(0, str.find_first_of("0123456789"));

只有一行:)

另外,对于这些事情,我喜欢使用正则表达式(虽然这种情况很简单):

string new_string = boost::regex_replace(str, boost::regex("[0-9]+$"), "");

答案 4 :(得分:0)

快速又脏又不太优雅:

for (int i = str.GetLength()-1; i >= 0; i--)
    {
    if (!isdigit(str.GetAt(i)) break;

    str.SetAt(i,'\0');
    }