2014-11-24 71 views
2

我試圖將一個字符串解析爲一個結構體中具有不同變量的向量。這是我迄今爲止,但它似乎並沒有工作。將字符串解析爲結構體變量

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 2014-11-24 05:27:10

+0

建議的意見:使用更多的描述性變量名稱。 – 2014-11-24 05:27:21

+0

爲什麼不使用[string :: find和string stream](http://ideone.com/EI82fL)? – 2014-11-24 05:41:21

回答

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 2014-11-24 06:38:36

+0

@Rush謝謝。固定。 – ooga 2014-11-24 15:44:20

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; 
    }