如何在 C 语言中按 ASCII 顺序对命令行参数进行排序
How to sort command line arguments in ASCII order in C language
我正在努力练习,我目前正在一所名为 1337 的 42 所附属学校做一个游泳池(如果你想知道为什么)。
- 我应该编写一个程序来显示命令行中按 ascii 顺序排序的参数。
- 我应该显示所有参数,argv[0] 除外。
- 每个参数都应该在它自己的行中(基本上放一个 \n)。
绝对禁止使用 printf,这被视为作弊,我唯一可以使用的函数是 unistd.h 库中的 write() #include
我已经完成了其他练习,我将 link 给你,一个正常显示参数,一个以相反顺序显示参数。
下面的代码只是打印参数
#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] != '[=10=]')
{
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] != '[=11=]')
{
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);
}
所以,如果有人可以帮助我,提供想法或一些代码,并在可能的情况下提供一些解释,我会很高兴。
谢谢。
您可以编写一个函数来对原位 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;
}
我正在努力练习,我目前正在一所名为 1337 的 42 所附属学校做一个游泳池(如果你想知道为什么)。
- 我应该编写一个程序来显示命令行中按 ascii 顺序排序的参数。
- 我应该显示所有参数,argv[0] 除外。
- 每个参数都应该在它自己的行中(基本上放一个 \n)。
绝对禁止使用 printf,这被视为作弊,我唯一可以使用的函数是 unistd.h 库中的 write() #include
我已经完成了其他练习,我将 link 给你,一个正常显示参数,一个以相反顺序显示参数。
下面的代码只是打印参数
#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] != '[=10=]')
{
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] != '[=11=]')
{
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);
}
所以,如果有人可以帮助我,提供想法或一些代码,并在可能的情况下提供一些解释,我会很高兴。
谢谢。
您可以编写一个函数来对原位 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;
}