Использование getline (param1, param2, param3) в C ++, Linux

0

... может быть таким простым вопросом, но я собираюсь написать простой 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*)
  • 0
    Вы не можете использовать getline для этого. Вы также не можете использовать больше (или меньше), чем один символ между одинарными кавычками. ' ' уволит вас быстрее, чем вы можете сказать "поведение, определяемое реализацией".
Теги:
delimiter
getline

1 ответ

0

Разделитель, используемый 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";
}
  • 0
    сено, Dietmar Kuhl, a проверил приведенный выше код, но кажется, что он не работает. У меня есть какая-либо библиотека для поддержки std :: tie ?? я получил следующую ошибку: ошибка: 'tie' не является членом 'std'
  • 0
    std::tie() происходит из <tuple> . Если у вас есть <tuple> вас должен быть std::tie() и чтобы его получить, вам нужно как минимум скомпилировать с C ++ 11. Если у вас его нет, вы можете просто захватить возвращенную пару и распределить параметры или изменить get_token() на, .eg, вернуть std::string и вместо этого взять ссылку на позицию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню