简体   繁体   English

随机密码生成器的C ++循环错误“退出非零状态”

[英]C++ Loop Error “Exited With Non-Zero Status” for Random Password Generator

So I'm trying to learn loops and conditionals in c++ so i decided to write a program that generates a random password for the user. 所以我正在尝试用c ++学习循环和条件,所以我决定编写一个为用户生成随机密码的程序。 For some reason the code works maybe 1/5 times, but the rest of the time it just gives me "Exited With Non-Zero Status". 由于某种原因,代码可能工作了1/5倍,但其余的时间它只是给了我“退出非零状态”。 Thanks, Evin 谢谢,艾文

#include <iostream>
#include <cstdlib>
#include <chrono>
#include <thread>
#include <time.h>
using namespace std;
int main() 
{
    using namespace std::this_thread;
    using namespace std::chrono;
//  Vars
    string lett;
    int input;
    string password("");
    string lettArray [] = {"a", "b", "c", "d", "e","f", "g", "h", "i", "j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};

//  Prompt
    cout << "How long would you like your password to be?";
    cin >> input;
//  Loop
    for(int i = 0; i < input; i++)
    {
        struct timespec ts;
        clock_gettime(CLOCK_MONOTONIC, &ts);
        srand((time_t)ts.tv_nsec);
        int random = (rand() % 26 + 1);
        lett = lettArray[random];
        password = password + lett;
        sleep_for(milliseconds(10));
        cout << "." << endl;
        if (random == 0 )
            break;
    }
//  Output
    cout << password << endl;
    return 0;
}

The reason that this program fails at random (pun intended) is that you are using C-arrays, and you got the index range wrong. 这个程序随机失败的原因(双关语意思是)你正在使用C数组,并且索引范围错误。

C-arrays, such as lettArray, do not check whether the array bounds are violated. C数组(例如lettArray)不检查数组边界是否被违反。 In your example, if you run this program, lettArray[26] will give you a segmentation fault because there is no string element in that memory address. 在您的示例中,如果您运行此程序, lettArray[26]将给您一个分段错误,因为该内存地址中没有string元素。 The C-array does not check the bounds, so it can be difficult to know what went wrong. C阵列不检查边界,因此很难知道出了什么问题。 This can get especially tricky in complicated programs because if something happens to be in that memory address you can get a nonsensical result. 在复杂的程序中,这可能会变得特别棘手,因为如果某些内容恰好存在于该内存地址中,则可以获得无意义的结果。

A better implementation would be using std::vector : 更好的实现是使用std::vector

#include <iostream>
#include <cstdlib>
#include <chrono>
#include <thread>
#include <time.h>
#include <vector>
using namespace std;
int main() 
{
    // You don't need these two lines
    //using namespace std::this_thread;
    //using namespace std::chrono;

    //  Vars
    string lett;
    int input;
    string password("");

    // Vector index range: 0-25
    vector<string> lettArray = {"a", "b", "c", "d", "e","f", "g", "h", "i", "j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};

    // You only need to initialise the seed once.
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    srand((time_t)ts.tv_nsec);

//  Prompt
    cout << "How long would you like your password to be?";
    cin >> input;

//  Loop
    for(int i = 0; i < input; i++)
    {
        int random = (rand() % 26 ); // You get results between 0-25
        // Using lettArray.at(26) will result in a crash with a clear 
        // message that bounds are violated  
        lett = lettArray.at(random); 
        password = password + lett;
        cout << "." << endl;

       // Don't see a reason for this if statement
       // if (random == 0 ){
       //     continue;
       //}
    }
//  Output
    cout << password << endl;
    return 0;
}

I also moved the random seed outside the loop (you only need this once), and there is also no reason to have the 10 millisecond pause. 我还在循环外移动了随机种子(你只需要这一次),也没有理由暂停10毫秒。 You will see that your results are properly randomised regardless. 无论如何,您都会看到您的结果是正确随机的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM