C ++:字符串格式

时间:2016-06-05 16:29:28

标签: c++ visual-c++ stdstring

这是我的输入字符串:Muhammad Ali 65445519 76 butterfly123

这是我想要的输出:Muhammad Ali xxx-xx-xxx 76 xxxxxxxxx

注意:除了社会安全号码(65445519)之外,所有内容的长度都有所不同,即姓名,用户ID(76)和密码(butterfly123)。

示例:

科比·布莱恩特34567890 548 56mamba

我试了一下但是我有一个长度为2的固定用户ID。任何人都可以想出一个用户ID也可以变化的解决方案吗?还是一种全新的不同方法?我不想使用字符串流,在其中逐个获取输入,然后分别处理字符串。然而,将理解有效且短的串流解决方案。感谢。

string s;
int j;
getline(cin,s);
for (int i=0; i<s.length(); i++)
{
    if(s.at(i)=='0' || s.at(i)=='1' || s.at(i)=='2'
        || s.at(i)=='3' || s.at(i)=='4' || s.at(i)=='5'
        || s.at(i)=='6' || s.at(i)=='7' || s.at(i)=='8'
        || s.at(i)=='9')
    {
        s.replace(i,8,"xxxxxxxx");
        s.insert(i+3,"-");
        s.insert(i+6,"-");
        j=i+14;
        break;
    }
}
for(j;j<s.length();j++)
{
    s.replace(j,1,"x");
}
cout<<s<<endl;

3 个答案:

答案 0 :(得分:2)

为什么不创建一个包含姓名,ID,密码的新班级......并且只需覆盖&#34;&gt;&gt;&#34;操作

并创建&#34; xxxxxxxxxx&#34;使用字符串构造函数:

string word(oldword.size(), 'x'); 

oldword.size()这个单词有多长,而且&#39; x&#39;是填充整个字符串的字符

答案 1 :(得分:1)

是的,你应该尝试不同的方法。

考虑以下输入

Sam123456789 FarkenParker 221778833 46 foobar

您的方法将最终取代&#34; 123456789&#34;使用X-s,这显然是错误的。

正确的方法:

1)将单个字符串拆分为以空格分隔的单词。使用std::array<std::string, 4>std::vector<std::string>,无论什么对您有用。

2)只需相应地替换第2和第5个单词。

3)然后将所有内容组合成一个字符串。

答案 2 :(得分:1)

您不必使用getline(cin,s);,您可以将数据读入单独的变量中:

std::string name, surname, password;
unsigned long long security, ID;

std::cin >> name >> surname >> security >> ID >> password;

std::string processed_security, processed_pwd(password.size(), 'x');

while (security) processed_security += "x", security /= 10;

std::cout << name << surname << processed_security << ID << processed_pwd << std::endl;

关于此代码的一些注意事项:

  1. 您可以使用较小的无符号整数数据类型作为ID(例如unsigned int
  2. security应该保存在一个可以容纳非常大数字的数据类型中,例如unsigned long long
  3. Docs for the std::string constructors used