Haluaisin saada merkkijonon, jossa on välilyönnein eroteltuja sanoja luetuksi vector-luokan säiliöön.
Toivomus olisi, että homma toimii aika turvallisesti ilman ylivuotoja tai muita ongelmia, vaikka tulevamerkkijono olisi vähän omituisempikin.
Nykyinen versioni on tällainen
std::vector<std::string> str_to_vec(char* cptr)
{
std::vector<std::string> vec;
std::string tok = "";
while( *cptr != '\0')
{
if(*cptr == ' ' && tok != "")
{
vec.push_back(trim(tok)); // tok valmis ' '-merkki päätti sen
tok = "";
cptr ++;
}
else
{
tok += *cptr;
cptr++;
if( *cptr == '\0') // tok valmis \n -merkki päätti sen
{
vec.push_back(trim(tok));
}
}
}
return vec;
}
Jotta vektoriin ei tule luetuksi välilyöntejä, funktiossa on trim-käsky, joka on toteutettu näin
std::string ltrim(const std::string &s) {
return std::regex_replace(s, std::regex("^\\s+"), std::string(""));
}
std::string rtrim(const std::string &s) {
return std::regex_replace(s, std::regex("\\s+$"), std::string(""));
}
std::string trim(const std::string &s) {
return ltrim(rtrim(s));
}
Kokonaisuus ei vaikuta kovin tyylikkäältä, kun kyseessä on vain aika yksinkertainen vektoritalletus ja sanojen poiminta.
Olisiko joitain keinoja, miten asian voisi hoitaa varmemmin ja tyylikkäämmin. (esim.nyt kai ainakin pitäisi varautua siihen, että merkkijonon loppumerkkiä ei koskaan tulisikaa, ja varmaan moneen muuhunkin mahdolliseen ongelmaan)