【问题标题】:Check length of a String检查字符串的长度
【发布时间】:2015-06-23 15:18:08
【问题描述】:

我是 C++ 的初学者。我们正在做一个项目,我们在其中输入员工的名字、姓氏和 SSN。这是我所做的:

#include <iostream>
#include <stdexcept>
#include "Employee.h"
using namespace std;

Employee::Employee(const string &first, const string &last, const string &ssn)
{
    firstName = first;
    lastName = last;
    SSN = ssn;
}

void Employee::setFirstName(const string &first)
{
    firstName = first;
}
string Employee::getFirstName() const
{
    return firstName;
}

void Employee::setLastName(const string &last)
{
    lastName = last;
}
string Employee::getLastName() const
{
    return lastName;
}

void Employee::setSSN(const string &ssn)
{
    if (ssn.length() == 9)
    {
        SSN = ssn;
    }
    else
    {
        cout << "Please enter SSN again: " << endl;
    }
}
string Employee::getSSN() const
{
    return SSN;
}

void Employee::print() const
{
    cout << "Employee: " << getFirstName() << ' ' << getLastName()
        << "\nSocial Security Number: " << getSSN();
}

我的导师希望我们检查 SSN 的长度(最简单的方法)以确保它是 9 位数字,如果多或少,请让用户重新输入。我不知道如何验证 SSN 的输入。谁能帮帮我?

【问题讨论】:

  • 检查字符串的长度和验证该字符串是两个不同的问题。想清理一下你的帖子吗?
  • @Axalo:别在 cmets 中回答了,伙计

标签: c++ string string-length


【解决方案1】:

std::string::length() 是用于查找长度的函数,std::string::empty() 用于检查天气字符串是否为空。

if(SSN.length() < 9 && !SSN.empty())
{
   //Need C++11 and above for this kind for loop
   for(auto &x: SSN)
   {
        if(std::isdigit(x))
        {
          //valid SSN
         }
   }

}

【讨论】:

  • 这行不通。字符串“HateTaxes”包含 9 个字符,但没有数字。它不是有效的美国社会安全号码 (ssn)。
  • 您的解决方案无法处理“123-45-5678”的标准格式,连字符会使字符串变长。
  • @ThomasMatthews 问题更具体,“SSN(最简单的方法)确保它是 9 位数字”
  • 您的回答如何“...确保它是 9 位数字”?我希望使用std::isdigit 或其他号码检查方法。
  • @ThomasMatthew 你能告诉我我们该怎么做吗?
【解决方案2】:

这个问题的紧凑解决方案:

bool ValidSSN(const std::string& ssn) {
  if (ssn.size() != 9) return false;
  return ssn.find_first_not_of("0123456789") == ssn.npos;
}

【讨论】:

    【解决方案3】:

    没有简单易行的解决方案来检查字符串的 9 位数字。

    我的建议是一个两步过程:

    • 验证长度为 9。
    • 验证字符串是否为整数。

    注意:else 子句中的代码不适用于“123Apple4”等情况。感谢@Steephen 的启发。将代码留在答案中以与 cmets 同步。

    在代码中是:

    bool is_valid = true;
    if (ssn.length() != 9)
    {
      is_valid = false;
    }
    else
    {
      std::istringstream ssn_stream;
      ssn_stream.str(ssn);
      unsigned int value;
      if (!(ssn_stream >> value))
      {
        is_valid = false;
      }
    }
    

    另一种选择是使用循环:

    if (ssn.length() != 9)
    {
      is_valid = false;
    }
    else
    {
      is_valid = true;
      for (unsigned int i = 0U; i < 9; ++i)
      {
        if (!isdigit(ssn[i]))
        {
          is_valid = false;
          break;
        }
      }
    }
    

    编辑 1:正则表达式
    如果你的编译器支持 C++ 正则表达式,你可以想出一个正则表达式来定义 SSN。然后,您将检查字符串的内容是否与正则表达式匹配。

    【讨论】:

    • 你的第一种方法是错误的。如果我输入 ssn_stream.str("123*");它会将其视为有效的 SSN。
    • @Steephen:到达std::istringstream 语句的唯一方法是字符串长度为9。因此“123*”的长度为4,并将is_valid 设置为false 和不进入第二次检查。
    • 如果数据如下:ssn="123******"会怎样
    • 感谢您指出一个不起作用的边界情况。修改后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2014-03-03
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多