000
19.09.2003, 11:08 Uhr
virtual
Sexiest Bit alive (Operator)
|
Nachdem im 47. Virtualrästel ~wissender eine Erweiterung angeregt hat, habe ich diese eingebaut:
C++: |
#include <string> #include <iostream> #include <algorithm> #include <stdexcept>
class StringTokenizer { private: std::string m_strText; std::string::size_type m_nTokenized; std::string m_strDelimiter; mutable int m_nCount;
public: StringTokenizer( const char* p_szText, char p_cDelimiter) :m_strText(p_szText), m_nTokenized(0), m_strDelimiter(std::string(1, p_cDelimiter)), m_nCount(-1) { }
StringTokenizer( const std::string& p_strText, char p_cDelimiter) :m_strText(p_strText), m_nTokenized(0), m_strDelimiter(std::string(1, p_cDelimiter)), m_nCount(-1) { }
StringTokenizer( const std::string& p_strText, const std::string& p_strDelimiter) :m_strText(p_strText), m_nTokenized(0), m_strDelimiter(p_strDelimiter), m_nCount(-1) { }
bool hasMoreTokens() const { return countTokens()>0; } int countTokens() const { if (-1 == m_nCount) { if (std::string::npos!=m_nTokenized) { m_nCount = 0; std::string::size_type i = m_nTokenized; while (std::string::npos!=i) { i = m_strText.find_first_of(m_strDelimiter, i); if (std::string::npos!=i) ++i; ++m_nCount; } std::cout<<m_nCount<<std::endl; // ??? BUG ??? }else { m_nCount = 0; } } return m_nCount; }
std::string getNextToken( char p_cDelimiter) { return getNextToken(std::string(1, p_cDelimiter)); }
std::string getNextToken() { return getNextToken(m_strDelimiter); }
std::string getNextToken( const std::string& p_strDelimiter) { if (std::string::npos==m_nTokenized) { throw std::runtime_error("No more tokens"); }
std::string::size_type nStart = m_nTokenized; m_nTokenized = m_strText.find_first_of(p_strDelimiter, m_nTokenized);
if (m_nCount>0) --m_nCount;
if (std::string::npos==m_nTokenized) { return m_strText.substr(nStart); } return m_strText.substr(nStart, m_nTokenized++ - nStart); } };
int main() { StringTokenizer tokenizer(getenv("PATH"), ':');
while (tokenizer.hasMoreTokens()) { std::cout<<tokenizer.getNextToken()<<" - "; std::cout<<tokenizer.countTokens()<<" tokens left"<<std::endl; } }
|
Das unangenehme an der Sache: Wenn die Zeile, die mit dem Kommentar BUG versehen ist, herausnehme, funktioniert die Methode countTokens nicht mehr (mit gcc 2.95.3, Linux)! Wenn das Feld m_nCount nicht mehr mutable deklarariere (und natürlich die ganzen Methoden ent-conste), dann geht es auch ohne die Zeile. Spinne ich oder der Compiler? EDIT: Natürlich glaube ich, daß der Compiler spinnt, aber kann das jemand bestätigen? -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 19.09.2003 um 11:17 Uhr von virtual editiert. |