首页 > 解决方案 > 变量 find 到底在做什么?

问题描述

这是一个比较参数并按字典顺序对它们进行排序的程序。你能解释一下find那里在做什么以及它如何影响代码吗?我在很多代码中都看到了这种模型;它的值在此期间在 1 和 0 之间变化,所以请您澄清一下。

int main(int argc, char **argv)
{
    char *tmp;
    int find;
    int i;

    find = 1;
    while (find)
    {
        find = 0;
        i = 0;
        while (++i < argc - 1)
        {
            if (strcmp(argv[i], argv[i + 1]) > 0)
            {
                tmp = argv[i];
                argv[i] = argv[i + 1];
                argv[i + 1] = tmp;
                find = 1;
            }
        }
    }
    i = 0;
    while (++i < argc)
        printf("%s\n", argv[i]);
    return (0);
}

标签: csortingbooleancommand-line-argumentsbubble-sort

解决方案


此代码段

find = 1;
while (find)
{
    find = 0;
    i = 0;
    while (++i < argc - 1)
    {
        if (strcmp(argv[i], argv[i + 1]) > 0)
        {
            tmp = argv[i];
            argv[i] = argv[i + 1];
            argv[i + 1] = tmp;
            find = 1;
        }
    }
}

实现冒泡排序算法。

最初,假设命令行参数没有按字符串排序。

find = 1;

然后在 while 循环中,标志find被重置为 0。

    find = 0;

如果在内部 while 循环内

while (++i < argc - 1)
{
        if (strcmp(argv[i], argv[i + 1]) > 0)
        {
            tmp = argv[i];
            argv[i] = argv[i + 1];
            argv[i + 1] = tmp;
            find = 1;
        }
}

找到一个大于下一个参数(字符串)的参数(字符串)

        if (strcmp(argv[i], argv[i + 1]) > 0)

然后交换相邻的参数,并将标志find设置为1表示参数数组尚未排序的信号(我们需要至少一次外部 while 循环的迭代,以检查在此交换之后是否所有参数确实已排序)。


推荐阅读