2014-11-06 12 views
0

Я взял все txt из файла и поместил строку за строкой в ​​массив строки. Я пытаюсь разбить эту строку, чтобы я мог сохранять слово за словом в отдельном массиве. Пожалуйста, просто скажите мне, как оболочка i преобразует массив строки в char.преобразовать массив sting в char

, например

string line[15]; // line[0] has : was there before 
        // line[1] has : then after 

char * pch; 
char *c = line.c_str(); // string to char (i am getting error here. Any body know?) 
    pch = strtok (c," "); 
    while (pch != NULL) 
    { 
    printf ("%s\n",pch); 
    pch = strtok (NULL, " "); 
    } 

ошибка: C2228: слева от '.c_str' должен иметь класс/структуры/объединения

+1

'line' является не строка. Это массив строк. Вы могли бы сделать 'line [0] .c_str()'. Вам также понадобится использовать 'const char * pch;' или вы получите еще одну ошибку. –

+2

'line' - это массив. Это не 'class/struct/union'. Возможно, вы имели в виду (например) 'char * c = line [0] .c_str();'? Кроме того, вы можете написать свою собственную функцию токена, которая работает с 'std :: string', вместо использования старых c-функций. – clcto

+0

Чтобы добавить к моему последнему комментарию, я написал функцию «tokenize» a назад, которую можно найти по адресу https://github.com/clcto/utile/blob/master/src/utile.cpp line 235 – clcto

ответ

2

string line[15]; является массивом строк. Поэтому, когда у вас есть строка line.c_str();, это указатель на строку, а не сама строка. Указатель не имеет метода .c_str(), поэтому компилятор жалуется. (Указатели не имеют каких-либо методов, и, следовательно, компилятор говорит вам, что левая часть выражения должна быть классом/структурой/объединением). Чтобы исправить это, вы хотите индексировать в массив, чтобы получить строку. Вы можете сделать это с чем-то вроде: line[0].c_str();

Кроме того, вы не можете написать ничего, возвращаемое c_str(), поскольку оно возвращает указатель const. Таким образом, вам нужно скопировать результаты с c_str прежде, чем вы начнете работать с ним, если собираетесь изменить его на месте.

Также стоит упомянуть, что существуют способы использования токенинга C++, здесь вы можете найти несколько примеров: Split a string in C++?. В последний раз, когда я это делал, я уже использовал boost, поэтому я использовал библиотеку boost::tokenizer.

+0

ok. путем записи char * c = line [0] .c_str(); дает мне ошибку, но когда я пишу таким образом char * c = line [0] .c_str; не давая мне ошибку. (я использую visual studio 2012), так что это правильно? – user3440716

+0

@ user3440716 вам нужно будет использовать что-то вроде 'const char * c = line [0] .c_str()', так как 'c_str()' - это метод, который вам нужен для скобок. – shuttle87

+0

путем размещения const дает ошибку: 'strtok': невозможно преобразовать параметр 1 из 'const char *' в 'char *' – user3440716

1

В C++ есть более простые способы сделать это. Функция strtok является функцией C и не может использоваться с std::string непосредственно, поскольку нет возможности получить доступ к записи для доступа к основным символам в std::string. Вы можете использовать iostream s для получения отдельных слов, разделенных пробелами из файла непосредственно на C++.

К сожалению, стандартной библиотеке не хватает простого, гибкого и эффективного метода разделения строк на произвольные символы. Это усложняется, если вы хотите использовать iostream s для выполнения разделения на что-то другое, кроме пробелов. Использование boost::split или предложение boost::tokenizer от челнока87 является хорошим вариантом, если вам нужно что-то более гибкое (и оно может быть более эффективным).

Вот пример кода чтения слова из стандартного ввода, вы можете использовать в значительной степени тот же код с ifstream для чтения из файла или stringstream для чтения из строки: http://ideone.com/fPpU4l

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <string> 

using namespace std; 

int main() { 
    vector<string> words; 
    copy(istream_iterator<string>{cin}, istream_iterator<string>{}, back_inserter(words)); 
    copy(begin(words), end(words), ostream_iterator<string>{cout, ", "}); 
    cout << endl; 
} 
Смежные вопросы