... может быть таким простым вопросом, но я собираюсь написать простой c++ код для синтаксического анализа строки с использованием разделителя, я хочу, чтобы разделитель содержал несколько пробелов (фактически одно или несколько пробелов). Мой вопрос: возможно ли это сделать? мой пример кода:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <cstring>
#include <sstream>
using namespace std;
int main()
{
string str="HELLO THIS IS 888and777";
char buf[1000];
getline(buf, 1000);
string str(buf);
stringstream stream(buf);
string toStr;
getline(stream, toStr,' ');//here the delimiter is six spaces
string str1=tostr;
getline(stream, toStr,' ');//here the delimiter is two spaces
string str2=tostr;
getline(stream, toStr,' ');//here the delimiter is three spaces
string str3=tostr;
cout<<str1<<"\t"<<str2<<"\t"<<str3<<endl;
return 0;
}
но я не могу использовать разделитель нескольких символов. любая идея пожалуйста. Я получаю следующую ошибку:
error: invalid conversion from ‘void* to ‘char**
error: cannot convert ‘std::string to ‘size_t* for argument ‘2 to ‘__ssize_t getline(char**, size_t*, FILE*)
Разделитель, используемый std::getline()
является чисто индивидуальным символом. Для принятия строки потребуется нетривиальный алгоритм для обеспечения подходящей производительности. Кроме того, сущности, определенные с использованием 'x'
обычно должны приводить к индивидуальному char
.
Для примера я считаю, что самый простой подход - просто токенизировать строку напрямую:
#include <tuple>
#include <utility>
#include <string>
#include <iostream>
std::pair<std::string, std::string::size_type>
get_token(std::string const& value, std::string::size_type pos, std::string const& delimiter)
{
if (pos == value.npos) {
return std::make_pair(std::string(), pos);
}
std::string::size_type end(value.find(delimiter, pos));
return end == value.npos
? std::make_pair(value.substr(pos), end)
: std::make_pair(value.substr(pos, end - pos), end + delimiter.size());
}
int main()
{
std::string str("HELLO THIS IS 888and777");
std::string str1, str2, str3;
std::string::size_type pos(0);
std::tie(str1, pos) = get_token(str, pos, " ");
std::tie(str2, pos) = get_token(str, pos, " ");
std::tie(str3, pos) = get_token(str, pos, " ");
std::cout << "str1='" << str1 << "' str2='" << str2 << "' str3='" << str3 << "'\n";
}
std::tie()
происходит из <tuple>
. Если у вас есть <tuple>
вас должен быть std::tie()
и чтобы его получить, вам нужно как минимум скомпилировать с C ++ 11. Если у вас его нет, вы можете просто захватить возвращенную пару и распределить параметры или изменить get_token()
на, .eg, вернуть std::string
и вместо этого взять ссылку на позицию.
getline
для этого. Вы также не можете использовать больше (или меньше), чем один символ между одинарными кавычками.' '
уволит вас быстрее, чем вы можете сказать "поведение, определяемое реализацией".