2014-11-06 1 views
0

... может быть таким простым вопросом, но я собираюсь написать простой код C++ для синтаксического анализа строки с использованием разделителя, я хочу, чтобы разделитель содержал несколько пробелов (фактически одно или несколько пробелов). Мой вопрос: возможно ли это сделать? мой код образца:Использование getline (param1, param2, param3) в C++, linux

#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' для этого. Вы также не можете использовать больше (или меньше) одного символа между одинарными кавычками. '' ''заставит вас уволить быстрее, чем вы можете сказать« поведение, определяемое реализацией ». –

ответ

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

hay, Dietmar Kuhl, a проверили вышеприведенный код, но, похоже, он не работает. У меня есть библиотека для поддержки std :: tie ?? Я получил следующую ошибку: error: 'tie' не является членом 'std' –

+0

'std :: tie()' исходит от ''. Если у вас есть '', вы должны иметь 'std :: tie()', и для его получения вам нужно будет скомпилировать хотя бы с C++ 11. Если у вас его нет, вы можете просто захватить возвращенную пару и распределить параметры или изменить 'get_token()' to, .e.g., Вернуть строку 'std :: string' и вместо этого взять ссылку на позицию. –