C++ MD2 ファイル ローダーでは、多くのフレームがあり、それぞれの名前は次のように数字で終わります。
- スタンド0
- スタンド1
- スタンド2
- スタンド3
- スタンド4
- ...
- スタンド10
- スタンド11
- 実行0
- 実行1
- run2
等
後ろに数字がない文字列を取得するにはどうすればよいですか? たとえば、「stand10」を単に「stand」に変更した機能
別の方法を示すために、イテレータを逆にします。
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());
string::find_last_not_of ("0123456789") と string::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」の場合、適切なベース名を取得することはできません。このことは、すでにご存知だと思います。
または、何か不足していますか?ベース名の末尾の接尾辞番号の直前に番号を付けることができない限り、問題なく機能します。
それを行う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.
}
クイックでダーティーでエレガントすぎない:
for (int i = str.GetLength()-1; i >= 0; i--)
{
if (!isdigit(str.GetAt(i)) break;
str.SetAt(i,'\0');
}