Это выглядит как ошибка, так как никогда не будет верным:
if(s == "")
это сравнение адреса s
с адресом строкового литерала ""
: он не проверяет, s
- пустая строка.Альтернативой использованию strtok()
будет boost::algorithm::split
:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
int main()
{
std::string s("a,string+with-multiple delimiters");
std::vector<std::string> s_tokens;
boost::algorithm::split(s_tokens, s, boost::is_any_of(",+- "));
std::for_each(s_tokens.begin(),
s_tokens.end(),
[] (const std::string& s)
{
std::cout << s << "\n";
});
return 0;
}
Вывод:
a
string
with
multiple
delimiters
Что касается свопа, как уже было указано в комментариях идругой ответ (ы) просто используйте std::swap()
.Я предполагаю, что lit
- это char[][]
, поэтому std::swap(lit[i][k], lit[i][l]);
будет делать именно то, что вам нужно.
РЕДАКТИРОВАТЬ:
После комментария с объявлением string* lit
и что появляется lit
чтобы быть массивом (из примера использования), используйте std::swap()
следующим образом:
std::string* lit = new std::string[4];
lit[0] = "zero";
std::swap(lit[0][1], lit[0][2]); // The characters will be passed by reference,
// don't take address.
std::cout << lit[0] << "\n"; // Prints "zreo"
Обратите внимание, что объявление вашего Swap()
передает аргументы по значению (неверно), но определение Swap()
передает аргументы по ссылке (правильно).Если вы измените объявление вашего Swap()
и вызовете его следующим образом, оно будет работать (если вы действительно не хотите использовать std::swap()
:
template<class T> void Swap(T&, T&);
//^ //^
Swap(lit[i][k], lit[i][l]);