在数组中,查看第一个数组的最后四个元素是否与第二个数组的最后4个元素匹配?

时间:2015-11-03 08:01:42

标签: c++ arrays for-loop strcmp

如何查看数组的最后四个元素是否与第二个数组的最后四个元素匹配?

例如,我正在编写密码程序。首先,询问用户他们的出生日期。然后要求他们输入密码。

对于出生日期数组,用户输入'05 / 14/1984' 对于密码数组,用户输入'coke_1984'

我正在尝试查看出生日期的最后四个是否与密码的最后四个相同,如果全部四个匹配,则添加1进行评分。

我完全陷入了困境!我现在的代码有一个“从'char'无效转换为'const char *'”

for(i = len; i <= len; i--)
{
    if(strcmp(birthdate, password[i]) == 0)
    {
        dateCMP = true;
    }else{dateCMP = false;}
}
if(dateCMP = true)
{
    score += 1;
    cout << "Your date of birth should not be the last four characters";
}

4 个答案:

答案 0 :(得分:3)

让您的生活更轻松,并充分利用已提供的STL设施,例如std::string

下面是一个函数,它将条目作为2个字符串,如果它们的最后4个字符相等则返回true,否则返回false:

bool
compare_last_4_characters(std::string const &str1, std::string const &str2) {
  std::size_t sz1 = str1.size();
  std::size_t sz2 = str2.size();
  if(sz1 > 3 && sz2 > 3) {
    return str1.substr(sz1 - 4, sz1) == str2.substr(sz2 - 4, sz2);
  }
  return false;
}

LIVE DEMO

如果你不能使用std::string下面的版本是没有它们的版本:

bool
compare_last_4_characters(char const *str1, char const *str2) {
  int sz1 = strlen(str1) - 4;
  int sz2 = strlen(str2) - 4;  
  if(sz1 >= 0 && sz2 >= 0) return !strcmp(str1 + sz1, str2 + sz2);
  return false;
}

LIVE DEMO

答案 1 :(得分:0)

我通过使用另一个数组来解决这个问题。我刚刚创建了一个名为compare的数组来存储密码的密码如果密码[i] == birthdate [i] ...然后使用if到strcmp(比较,生日)......

for(i = len-4; i < len; i++)
{
    if(birthdate[i] == password[i])
    {
        compare[i] = password[i];
    }
}
if(strcmp(compare, birthdate))
{
    score += 1;
}

感谢您尝试提供帮助!

答案 2 :(得分:0)

#include <iostream>
#include <utility>
#include <algorithm>

//size_t literal: see http://stackoverflow.com/questions/22346369/initialize-integer-literal-to-stdsize-t
constexpr std::size_t operator "" _z(unsigned long long n)
{
    return n;
}

bool lastFourEquals(const char* str1, size_t strlen1, const char* str2, size_t strlen2)
{
    //variant 1: do not allow shorter strings
    //if(strlen1 < 4 || strlen2 < 4) return false;

    //Variant 2: maximum of last for equals (e.g. "123"=="0123")
    size_t maxLen =std::min(std::max(strlen1, strlen2), 4_z);

    for (int i = 1; i <= maxLen; i++)
    {
        size_t pos1 = strlen1 - i;
        size_t pos2 = strlen2 - i;
        if (str1[pos1] != str2[pos2]) return false; //Found difference
    }

    return true;
}

int main()
{
    const char* test1 = "05/14/1984";
    const char* test2 = "coke_1984";

    bool eq = lastFourEquals(test1, strlen(test1), test2, strlen(test2));

    std::cout << (eq ? "true" : "false") << std::endl;
}

答案 3 :(得分:0)

我觉得这很有效!我终于明白了。这是一个痛苦的屁股无法使用字符串库。请告诉我!你们这些帮助很多。不要担心我在函数中的其他参数,我还没有使用它们。

//this function runs to see if the first letter of last name matched
//first letter of password, if the birthdate

int checkStrength(char password[SIZE], char lastName[SIZE], char 
birthdate[SIZE], char carMake[SIZE], int favNum)
{

//array and variables for use through the checks
char compareDate[SIZE];
int weakness = 0;
int len = strlen(password) - 4;
int i;
int c = 0;

//this for loop compares arrays, if comparison is found, adds element to
//compareDate and then uses an if statement to strcmp compare and birthdate
//if compare and birthdate are then the same, add weakness
for(i = 0; i < len; i++)
{
    if(birthdate[c] == password[len])
    {
        compareDate[c] = password[i];
        c += 1;
    }
}
if(strcmp(compareDate, birthdate) == 1)
{
    weakness += 1;
    cout << "Your birth year should not be the last four character of your 
    password.";
    cout << compareDate;
}

//this checks to see if the car make array is used in order through password,
//if it is, add weakness


return weakness;

}