2011-02-23 133 views
1

我需要输入3用逗号将单个字符串分解为多个字符串C++?

全称1分离全名:约翰史密斯,弗林
全名2:沃尔特·肯尼迪,罗伯特
全名3:萨姆,低音,克林顿

然后输出像这样

名1:约翰
名2:沃尔特
名3:山姆

中间名1:史密斯
中间名2:肯尼迪
中间名3:低音

姓1:弗林
姓2:罗伯茨
姓3:克林顿

我如何做这些? 到目前为止,这是我的代码

#include<iostream> 
#include<cstdio> 
#include<cstring> 
using namespace std; 

int main() { 
    char first[3][100]; 
    char middle[3][100]; 
    char last[3][100]; 
    char full[3][100]; 
    int i; 

    cout << "Enter 3 Full Names <first, middle and last names separated by comma>:" << endl; 
    for (i=0; i<3; i++) { 
     cout << "Full Name " << i+1 << ":" ; 
     gets (full[i]);   
    } 

    cout << "The first names are: " << endl; 
    for (i=0; i<3; i++) { 
     strcpy (first[i], full[i]); 
     if (strcmp (first[i], ", ")) { 
      cout << "First Name "<< i+1 << ":" ; 
      strcpy (first[i], full[i]); 
      cout << (first[i]); 
      cout << endl; 
     } 
    } 
    cout << "The middle names are: " << endl; 
    for (i=0; i<3; i++) { 
     cout << "Middle Name "<< i+1 << ":" ; 
     cout << (middle[i]); 
     cout << endl; 
    } 
    cout << "The last names are: " << endl; 
    for (i=0; i<3; i++) { 
     cout << "Last Name "<< i+1 << ":" ; 
     cout << (last[i]); 
     cout << endl; 
    } 
    system("pause"); 
    return 0; 
} 
+6

哪里标记[作业]? – p4553d

+1

添加了作业标签。 – Tom

+0

我们不允许使用矢量 刚的iostream,为c_string和cstdio! 有人可以张贴一个字符串,然后将它分成3个多串的例子吗? 我只是学习C++所以请简化它 谢谢。 – 2011-02-23 14:27:08

回答

1

我觉得这里你想做的是string类划分方法,该方法应该是这样的:

void SplitName(const string& fullName, const string& delims, vector<string>& names) 
{ 
    size_t i = 0; 
    size_t j = 0; 
    while (i < fullName.size()) 
    { 
     i = fullName.find_first_not_of(delims, i); 
     j = fullName.find_first_of(delims, i); 
     if (i < fullName.size()) 
     { 
      names.push_back(fullName.substr(i, j - i)); 
     } 
     i = j; 
    } 
} 

可以定义“:”作为分隔符,那么名字[1]是名字,名字[2]是中间名,名字[3]是姓。

+0

我们只allwed使用的:#include 的#include 的#include Silver

1

我可能会做这样的事情:

编辑:经过一番思考,我决定重复真的打扰我太多,所以我已经消除它。我不确定它在技术上是否允许(std::string不是POD),但它似乎起作用,并且使我感觉更好,更具可扩展性。

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

struct name { 
    std::string first, middle, last; 
}; 

std::istream &operator>>(std::istream &is, name &n) { 
    char ch; 
    is.ignore((unsigned)-1, ':'); 
    is.ignore(1); 

    std::getline(is, n.first, ','); 
    std::getline(is, n.middle, ','); 
    std::getline(is, n.last); 
    return is; 
} 

struct item { 
    size_t offset; 
    char *caption; 
}; 

void show(name const &n, item const &i) { 
    // as predicted, eliminating the duplication did lead to one gnarly line of code: 
    std::string &name = *(std::string *)((char *)&n+i.offset); 
    std::cout << i.caption << name << "\n"; 
} 

int main() {  
    std::vector<name> names; 

    std::string raw_data("Full Name 1: John, Smith, Flynn\nFull Name 2: Walter, Kennedy, Roberts\nFull Name 3: Sam, Bass, Clinton"); 

    std::istringstream infile(raw_data); 

    std::copy(std::istream_iterator<name>(infile), 
       std::istream_iterator<name>(), 
       std::back_inserter(names)); 

    item items[] = { 
     {offsetof(name, first), "First Name: "}, 
     {offsetof(name, middle), "Middle Name: "}, 
     {offsetof(name, last), "Last name: "} 
    }; 

    for (int i=0; i<3; i++) { 
     for (int j=0; j<3; j++) 
      show(names[j], items[i]); 
     std::cout << "\n"; 
    } 
    return 0; 
} 
+0

我们只allwed使用的:#include 的#include 的#include Silver

+0

但你为什么不使用指针到成员代替?您使用偏移的方式看起来像是尝试手动重新实现指向成员的指针。 – AnT

+0

@安:五年前,我可能会有一个答案,但在这个迟到的日子,我真的不记得了。 –

0
void DumpName(char* pBuffer, char cDelimiter, int iCounter); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char full[3][100]; 

    cout << "Enter 3 Full Names <first, middle and last names separated by comma>:" << endl; 
    for (int i=0; i<3; i++) { 
     cout << "Full Name " << i+1 << ":" ; 
     gets (full[i]);   
    } 

    for(int i=0; i<3; i++) 
    { 
     cout << "First Name "<< i+1 << ":" ; 
     DumpName(full[i], ',', 0); 
    } 

    for(int i=0; i<3; i++) 
    { 
     cout << "Middle Name "<< i+1 << ":" ; 
     DumpName(full[i], ',', 1); 
    } 

    for(int i=0; i<3; i++) 
    { 
     cout << "Last Name "<< i+1 << ":" ; 
     DumpName(full[i], ',', 2); 
    } 

    return 0; 
} 

void DumpName(char* pBuffer, char cDelimiter, int iCounter) 
{ 
    int iFound = 0; 

    char* pStart = pBuffer; 
    char* pCurrent = pBuffer; 
    while(*pCurrent != '\0') 
    { 
     if(*pCurrent == cDelimiter) 
     { 
      if(iFound == iCounter) 
      { 
       *pCurrent = '\0'; 
       cout << pStart << endl; 
       *pCurrent = cDelimiter; 
       return; 
      } 

      pStart = pCurrent; 
      pStart ++; 
      iFound ++; 
     } 

     pCurrent ++; 
    } 

    if((iCounter - iFound) == 0) 
     cout << pStart << endl; 
} 
相关问题