从函数返回cstring

时间:2017-06-11 18:54:54

标签: c++ validation c-strings

需要使用cstrings进行任务,所以请耐心等待,因为我对这个概念不熟悉。

分配的目的是在函数中输入密码,根据某些条件对其进行验证,然后反转密码并再次验证。共有三个功能:一个用于从用户获取密码,一个用于验证,另一个用于反转输入的内容。

注意:在验证期间,必须在返回main的无效消息中解决未满足的每个条件。

主:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <cstring>
#include <cctype>
#include <string>

using namespace std;

char* Get_Pass(char p_word[]);
char* Valid_Pass(char p_word[]);
//char* Reverse_Pass(char p_word[]);

int main()
{
  const int SIZE = 31;
  char password[SIZE];

  char* rtn_stg = new char[SIZE];
  char* rtn_ptr;

  rtn_stg = Get_Pass(password);
  rtn_ptr = rtn_stg;
  cout << Valid_Pass(rtn_stg);

  //cout << Reverse_Pass(rtn_string, SIZE);

  delete[] rtn_ptr;

  cout << "\n\n";
  system("pause");
  return 0;
  }

我遇到的问题是双重的;第一个功能正常。如果我禁用了其他所有内容并将结果发送回main,它将打印我输入的内容。将密码传递给第二个函数进行验证时,它会输出垃圾代码以及未满足条件的消息,例如:

“输入验证密码:你好 ══════════════════════════════════════════════════ ══════════════════════════════ ═══════════════════════════════════════════════²²²²▌▌ ▌▌▌·ò= uYPassword必须是si x个字符长。密码必须包含一位数。“

这是有问题的功能:

char* Valid_Pass(char p_word[])
{
  int char_count = 0, digi_count = 0, up_count = 0, low_count = 0, index = 0;
  char mess_1[] = "Password must be six characters long. ";
  char mess_2[] = "Password must contain one digit. ";
  char mess_3[] = "Password must contain one upper and lower case letter. ";
  char mess_4[] = "Password valid.";

  const int SIZE = strlen(mess_1) + strlen(mess_2) + strlen(mess_3) + 1;
  char* out_message = new char[SIZE];

  while (p_word[index] != '\0')
  {
    if (isalpha(p_word[index]))
        char_count++;
    if (isdigit(p_word[index]))
        digi_count++;
    if (isupper(p_word[index]))
        up_count++;
    if (islower(p_word[index]))
        low_count++;
    index++;
  }
  if (index < 6)
    strcat(out_message, mess_1);
  if (digi_count < 1)
    strcat(out_message, mess_2);
  if (up_count < 1 && low_count < 1)
    strcat(out_message, mess_3);
  //if(index )
    //out_message = mess_4;

  return out_message;
}

最重要的是,在执行时,它会触发“delete [] rtn_ptr”的断点。

对此有任何见解将不胜感激。就像我上面所说的那样,我是cstrings的新手,在这里找不到解决我遇到的问题的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题是由strcat使用message_out作为参数引起的。

strcat的参数需要以空字符结尾的字符串。在您的情况下,您已为message_out分配了内存,但在第一次调用strcat之前尚未对其进行任何初始化。因此,您的程序具有未定义的行为。

确保在使用strcat之前将其初始化为空字符串。

out_message[0] = '\0';
if (index < 6)
  strcat(out_message, mess_1);
if (digi_count < 1)
  strcat(out_message, mess_2);
if (up_count < 1 && low_count < 1)
  strcat(out_message, mess_3);