程序似乎在 for 循环后静默终止 - C++

Program seems to silently terminate after for-loop - C++

我创建了一个程序,打印出通过命令行参数提供的所有字符排列,并决定将执行时间与用 Java.[=24= 编写的等效程序进行比较]

该程序一直有效,直到我决定多次查找排列以获得平均执行时间。

void avgTime(char**& argv, int times) {
    if (sizeof(argv) > 1) {

        long permutationAmnt;

        clock_t s_start, s_end, t_start, t_end;
        float s_runms, t_runms;

        long avg_time;

        for (int count = 0; count < times; count++) {

            t_start = clock();

            for (int i = 1; i < sizeof(argv); i++) {
                s_start = clock();
                permutationAmnt = permutations(std::string(argv[i]));
                s_end = clock();

                s_runms = ((float)s_end - s_start) / CLOCKS_PER_SEC * 1000;
                std::cout << "SUCCESS (" << s_runms << "ms for " << permutationAmnt << " permutations)" << std::endl << std::endl;
            }

            t_end = clock();

            t_runms = ((float) t_end - t_start) / CLOCKS_PER_SEC * 1000;
            std::cout << std::endl << "TOTAL RUNTIME: " << t_runms << "ms" << std::endl;
            avg_time += t_runms;
        }

        std::cout << "AVERAGE RUNTIME: " << avg_time / times << "ms" << std::endl;
    }
}

int main(int argc, char** argv) {
    avgTime(argv, 10);
    return 0;
}

avgTime() 中的第一个 for 循环只执行一次(将 cout 放入其中只打印一次)并且程序似乎在嵌套 for 循环中断后终止。

我不确定问题是来自 avgTime() 中的某些代码,还是来自辅助函数之一,例如 permute()。无论哪种方式,这里都是每个辅助函数的代码以及包含的代码(p.s。num 在任何函数之外声明)。

/*
* Calls the recursive permute() function then
* returns the total amount of permutations possible
* for the given input.
*
* NOTE: the num variable is used in the permute() function
* for numbering the permutations printed as output (see next function
* for clarificiation)
*/
long permutations(const std::string& arg) {
    long totalPermutations = factorial(arg.size()); //self-explanatory

    num = 1;
    permute(arg, 0);

    return totalPermutations;
}


/*
 * Recursively prints out each permutation
 * of the characters in the argument, str
 */
void permute(const std::string& str, int place) {
    if (place == str.size() - 1) std::cout << ((num <= 10) ? "0" : "") << num++ << ". " << str << std::endl;

    for (int i = place; i < str.size(); i++) {
        permute(swap(place, i, str), place + 1); //self-explanatory
    }
}

long factorial(int num) {
    if (num < 2) {
        return 1;
    }
    return factorial(num - 1) * num;
}

std::string swap(int i, int j, const std::string& str) {
    std::string s(str);
    s[i] = s[j];
    s[j] = str[i];
    return s;
}

注意:permute() 函数在源代码中出现在 permutation() 函数之前,并且对所有必要的调用者可见。

//Includes and namespace stuff
#include <iostream>
#include <string>
#include <time.h>

如果您希望我提供任何其他信息,请告诉我,如果您能提供任何帮助,我将不胜感激。再次感谢您的帮助。

P.S。不,这不是家庭作业 :P

编辑:删除了 using namespace std; 并相应地调整了代码以避免函数 std::swap() 和我自己的 swap() 函数之间的混淆。此外,添加了 swap()factorial() 函数以避免任何歧义。对于由此造成的混乱,我深表歉意。

我使用的是 sizeof(argv) 而不是 argc。切换到后一个选项解决了这个问题。