如何从字符串的末尾提取数字

时间:2010-11-01 19:25:12

标签: c++ c stl

给出如下字符串:

   sdfsd34 
    sdfdsf1

我想提取: 34,1 使用c ++(STL但没有提升),c。

感谢

7 个答案:

答案 0 :(得分:25)

您正在搜索string.find_last_not_of函数:

string str = "sdfsd34";
size_t last_index = str.find_last_not_of("0123456789");
string result = str.substr(last_index + 1);

答案 1 :(得分:4)

这里有很多取决于你是否更习惯字符串操作,或者使用STL样式的迭代器等。正如@Konrad已经指出的那样,std::string内置了find_last_not_of,适合任何喜欢字符串式操作的人。

如果您愿意,可以使用更像容器的字符串,并从结尾开始查找第一个非数字:

std::string::iterator pos = std::find_if(
    mystring.rbegin(), 
    mystring.rend(), 
    std::not1(std::isdigit)).base();

在这种情况下,从reverse_iteratoriterator的转换恰好很好。 reverse_iterator返回的find_if将引用之前的最后一个元素字符串末尾的一组连续数字。但是,base将引用第一个数字(如果结尾没有数字,则为mystring.end(),或者如果整个字符串由数字组成,则为(不幸))。

答案 2 :(得分:2)

初始版本,使用<algorithm>

string input("aasdf43");
string matches("01234567890");

string::iterator iter = find_first_of(input.begin(), input.end(), 
        matches.begin(), matches.end());

string next(iter, input.end());

stringstream intStream(next);
int intValue;
intStream >> intValue;

编辑:最好使用成员函数:

string input("aasdf43");
string matches("0123456789");
size_t offset = input.find_first_of(matches);
string next(input.substr(offset));

stringstream intStream(next);
int intValue;
intStream >> intValue;

只是为了衡量标准 - <algorithm>版本不需要检查所有数字。

string::reverse_iterator iter = find_if_not(input.rbegin(), input.rend(), 
    ([&](char c) { return c >= '0' && c <= '9';}));
reverse(input.rbegin(), iter);
string reversed(input.rbegin(), iter);

stringstream intStream(reversed);
int intValue;
intStream >> intValue;

答案 3 :(得分:2)

这是一个C解决方案。您必须包含stdio.h和ctype.h才能使其正常工作。

char* str = "djafldjsalj124"; 
long n; 

char *s = str; 
while (*s && !isdigit(*s)) s++; 
if (*s)
{
 sscanf(s, "%d", &n);  
 printf("%d\n", n); 
}

答案 4 :(得分:1)

如果它们总是在最后,那么只需从字符串的末尾开始并查找一个数字,当你到达第一个非数字数字时,就可以了。看看reverse_find,或find_reverse,或类似的东西。自从我在STL中完成任何字符串操作以来已经有很长一段时间了。作为一个老式的程序员,我可能最终将它转换为一个char数组(如果它不是一个超长字符串),并做愚蠢的指针技巧,但那只是我。

答案 5 :(得分:0)

已发布的C ++解决方案非常合理。在C中,您可以使用strpbrk。这使得第一次出现任何一组字符,因此如果不能保证数字出现在字符串的末尾,则需要调用strpbrk直到它返回null,在下一次调用之前保存前一个调用的结果呼叫。 strchr没有反向strpbrk,至少我知道。

答案 6 :(得分:0)

假设str是有问题的字符串,我将包含指向数字开头的字符的指针...

char* i;
for(i = str + strlen(str) - 1; i >= str && *i >= '0' && *i <= '9'; i--);
i++;
相关问题