给出如下字符串:
sdfsd34
sdfdsf1
我想提取: 34,1 使用c ++(STL但没有提升),c。
感谢
答案 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_iterator
到iterator
的转换恰好很好。 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++;