【问题标题】:C++: String formattingC++:字符串格式化
【发布时间】:2016-10-05 06:43:58
【问题描述】:

这是我的输入字符串: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;

【问题讨论】:

  • 为什么不包括cctype 并使用isdigit((unsigned char)s.at(i)) 而不是if 中的长条件?
  • @MikeCAT 谢谢哥们,用过。

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


【解决方案1】:

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

考虑以下输入

Sam123456789 FarkenParker 221778833 46 foobar

您的方法最终会用 X-s 替换“123456789”,这显然是错误的。

正确做法:

1) 将单个字符串拆分为空格分隔的单词。使用std::array&lt;std::string, 4&gt; 或std::vector&lt;std::string&gt;,任何适合您的方式。

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

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

【讨论】:

  • 感谢您指出错误。如果您想出任何其他方法,请告诉我,不要使用数组、向量或类。
【解决方案2】:

您实际上不必使用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

【讨论】:

  • 谢谢,这可能是唯一的方法,其他方法可能会导致错误。
【解决方案3】:

为什么不创建一个具有名称、ID、密码的新类...并覆盖“>>”运算符?

并使用字符串构造函数创建“xxxxxxxxxx”:

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

oldword.size() 是单词的长度,'x' 是填充整个字符串的字符

【讨论】:

  • @Mohsin 你可以创建一个结构,但这就像一个类 :D 我喜欢创建类,因为你可以覆盖它们的所有操作符,然后你可以在它们上使用标准模板库中的函数就像他们是基本类型一样
  • @MiloRadosavljevic 上面的答案是可行的,我正在解决一个问题,它声明不使用类,但无论如何都应用了所有其他建议。谢谢
  • @Mohsin 你可以使用比较功能而不是很多“如果”cplusplus.com/reference/string/string/compare
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
相关资源
最近更新 更多