【问题标题】:How to sort command line arguments in ASCII order in C language如何在 C 语言中按 ASCII 顺序对命令行参数进行排序
【发布时间】:2019-11-27 15:26:45
【问题描述】:

我正在努力锻炼,我目前正在与 42 名为 1337 的附属学校一起做一个游泳池(如果你好奇为什么)。

  • 我应该编写一个程序来显示命令行中给定的参数,按 ascii 顺序排序。
  • 我应该显示所有参数,除了 argv[0]。
  • 每个参数都应该在它自己的行中(基本上放一个 \n)。

绝对禁止使用 printf 并被视为作弊,我被允许使用的唯一函数是 write(),来自 unistd.h 库#include

我做了其他练习,我将链接到你,一个正常显示参数,一个以相反的顺序显示参数。

下面的代码实际上只是打印参数

#include <unistd.h>

void        ft_putchar(char ch)
{
    write(1, &ch, 1);
}

void        ft_print_params(int argc, char *argv)
{
    int i;

    i = 0;
    while (i < argc)
    {
        while (argv[i] != '\0')
        {
            ft_putchar(argv[i]);
            i++;
        }
        i++;
    }
}

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

    i = 1;
    while (i < argc)
    {
        ft_print_params(argc, argv[i]);
        ft_putchar('\n');
        i++;
    }
    return (0);
}

下面的程序以相反的顺序打印参数。

#include <unistd.h>

void        ft_putchar(char ch)
{
    write(1, &ch, 1);
}

void        ft_print_params(char *argv)
{
    int i;

    i = 0;
    while (argv[i] != '\0')
    {
        ft_putchar(argv[i]);
        i++;
    }
}

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

    i = argc;
    if (1)
    {
        while (i > 1)
        {
            ft_print_params(argv[i - 1]);
            ft_putchar('\n');
            i--;
        }
    }
    return (0);  
}

因此,如果有人可以帮助我,我会很高兴,无论是想法,还是一些代码,并在可能的情况下提供一些解释。

谢谢。

【问题讨论】:

  • 你可以使用qsort()吗?
  • 你知道如何对字符串数组进行排序吗?然后你就准备好了,因为这就是argv 的全部内容:一个字符串数组(它是一个指针数组,但你可以将其视为一个字符串数组)。
  • 你发布的两个版本的代码在我看来是一样的。你为什么将argc 传递给ft_print_params
  • @Shawn 不,我不是,允许使用它,唯一允许我使用的功能是写入,仅用于打印。
  • @Someprogrammerdude 是的,我知道该怎么做,但我有点困惑。

标签: c bash shell command-line-arguments


【解决方案1】:

您可以编写一个函数来在原位对char * 的数组执行简单的插入排序:

#include <string.h>

void ft_sort_strings(int num, char **s)
{
    int i, j;
    for (i = 1; i < num; i++)
    {
        for (j = i; j > 0 && strcmp(s[j-1], s[j]) > 0; j--)
        {
            char *temp = s[j-1];
            s[j-1] = s[j];
            s[j] = temp;
        }
    }
}

然后,从main 调用它来排序argv,跳过第一个元素:

    ft_sort_strings(argc - 1, argv + 1);

然后,您只需要像以前一样遍历参数并打印它们。

如果您不允许使用标准库中的strcmp,可以很容易地将其替换为您自己的ft_strcmp

int ft_strcmp(const char *a, const char *b)
{
    while (*a && *a == *b)
    {
        a++;
        b++;
    }
    return *a - *b;
}

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多