2014-11-24 2 views
2

Im пытается разобрать строку в вектор структуры, которая имеет в ней разные переменные. Это то, что у меня есть до сих пор, но оно, похоже, не работает.Parsing String в структурные переменные

struct client 
{ 
    string PhoneNumber; 
    string FirstName; 
    string LastName; 
    string Age; 
}; 
int main() 
{ 
    string data = getClientDatabase(); 

    vector <client> clients; 

    parse_string(data, clients); 
    return 0; 
} 

string getClientDatabase() 
{ 
    return 
     "(844)615-4504 Sofia Ross 57 \n" 
     "(822)516-8895 Jenna Doh 30 \n" 
     "(822)896-5453 Emily Saks 43 \n" 

} 

Так эта функция я писал не кажется, работает, я уверен, есть более простой способ, но я не могу понять это.

void parse_string(string data, vector <client> &clients) 
{ 
    string temp; 
    string temp1; 
    string temp2; 
    string temp3; 

    int i = 0; 
    int j = 0; 
    int k = 0; 
    int l = 0; 

    while (i < data.length()) 
    { 
     if (data.at(i) != ' ') 
     { 
      temp.push_back(data.at(i)); 
      j++; 
     } 
     else 
     { 
      clients.at(i).PhoneNumber = temp; 
     } 

    } 
    if (data.at(j) != ' ') 
    { 
     temp1.push_back(data.at(j)); 
     k++; 
    } 
    else 
    { 
     clients.at(i).FirstName = temp1; 
    } 

    if (data.at(k) != ' ') 
    { 
     temp2.push_back(data.at(k)); 
     l++; 
    } 
    else 
    { 
     clients.at(i).LastName = temp2; 
    } 

    if (data.at(l) != ' ') 
    { 
     temp3.push_back(data.at(l)); 

    } 
    else 
    { 
     clients.at(i).Age = temp3; 
    } 
    i++; 

} 
+0

Ваша главная проблема является неуместной скобка , – ooga

+0

Совет: используйте более описательные имена переменных. –

+0

Почему вы не используете [string :: find и строковый поток] (http://ideone.com/EI82fL)? –

ответ

1

Попробуйте использовать istringstream объект:

void parse_string(string data, vector <client> & clients) { 
    istringstream iss(data); 
    for (size_t i=0; iss >> clients.at(i).PhoneNumber; ++i) { 
    iss >> clients.at(i).FirstName 
     >> clients.at(i).LastName 
     >> clients.at(i).Age; 
    } 
} 
+1

Возможно, вы захотите сначала добавить PhoneNumber? – Rush

+0

@Rush Спасибо. Исправлена. – ooga

0

вы можете попробовать этот код:

void parse_string(string data, vector <client> & clients) 
{ 
    struct client tempS; 
    istringstream iss(data); 
    for (size_t i=0; iss >> tempS.PhoneNumber; ++i) 
    { 
     iss >> tempS.FirstN >> tempS.LastN >> tempS.Age; 
     clients.push_back(tempS); 
    } 
} 

// тестовый код

vector <client>::iterator it = clients.begin(); 
    for(; it != clients.end(); ++it) 
    { 
     cout << it->PhoneNumber << " " 
      << it->FirstN << " " 
      << it->LastN << " " 
      << it->Age << endl; 
    }