gpt4 book ai didi

c - 如何使用函数按字典顺序对分割命令行参数进行排序?

转载 作者:行者123 更新时间:2023-11-30 14:41:46 24 4
gpt4 key购买 nike

我正在开发一个程序,它接受命令行参数并将它们分成两半,然后按字典顺序对它们进行排序。例如:

你好,世界!

会变成:

ld!

呵呵

世界

我有一个读取参数的 main 方法,一个分割参数的函数,最后一个应该按字典顺序对两半进行排序的函数。由于 lexicographyalSort 方法中的参数类型错误和 main 方法中的指针类型不兼容,我无法使其正常运行。我在纠正这些语法错误时遇到问题,我该如何纠正它们?另外,这里有什么会导致逻辑错误的地方吗?这是我到目前为止所拥有的:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int splitString(char arg[], int n)
{
int len = strlen(arg);
int len1 = len/2;
int len2 = len - len1; // Compensate for possible odd length
char *s1 = malloc(len1 + 1); // one for the null terminator
memcpy(s1, arg, len1);
s1[len1] = '\0';
char *s2 = malloc(len2 + 1); // one for the null terminator
memcpy(s2, arg + len1, len2);
s2[len2] = '\0';
printf("%s\n", s1);
printf("%s\n", s2);
free(s1);
free(s2);

return 0;
}

int lexicographicalSort(char *arg[], int n)
{
char temp[50];

for(int i = 0; i < n; ++i)
scanf("%s[^\n]",arg[i]);

for(int i = 0; i < n - 1; ++i)
for(int j = i + 1; j < n ; ++j)
{
if(strcmp(arg[i], arg[j]) > 0)
{
strcpy(temp, arg[i]);
strcpy(arg[i], arg[j]);
strcpy(arg[j], temp);
}
}

for(int i = 0; i < n; ++i)
{
puts(arg[i]);
}

return 0;
}

int main(int argc, char *argv[])
{
if (argc > 1)
{
for (int i = 1; i < argc; i++)
{
int j = 1;
int k = strlen(argv[i]);

splitString(argv[i], j);
lexicographicalSort(argv[i], j);

}
}

}

最佳答案

基本方案很简单。创建一个元组数组 {start_pointer, length}。对 args 进行一些编程以拆分 args。根据需要填写数组。使用 qsort 或您选择的任何其他类型进行排序。

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

char *s = "hello, world! . hello.....";
char *pc;
int i, n, nargs;

struct pp{
char *p;
int l;
};

struct pp args[10], hargs[20];
struct pp *pargs;

int cmp(const void * v0, const void * v1) {
struct pp *pv0 = v0, *pv1 = v1;
return strncmp(pv0->p, pv1->p, pv0->l);
}

int main(void)
{
for(pc = s, i = 0; *pc; ++i){
sscanf(pc, "%*[^ ]%n", &n);
if(n > 0){
args[i].p = pc;
args[i].l = n;
}
for(pc += n, n = 0; isspace(*pc); ++pc);
}
for(nargs = i, i = 0; i < nargs; ++i)
printf("%d arg is: %.*s\n", i, args[i].l, args[i].p);
putchar('\n');
for(i = 0, pargs = hargs; i < nargs; ++i){
if(args[i].l == 1){
pargs->p = args[i].p;
pargs->l = 1;
pargs = pargs + 1;
}else {
pargs->p = args[i].p;
pargs->l = args[i].l / 2;
pargs = pargs + 1;
pargs->p = args[i].p + args[i].l / 2;
pargs->l = args[i].l - args[i].l / 2;
pargs = pargs + 1;
}
}
putchar('\n');
for(nargs = pargs - hargs, i = 0; i < nargs; ++i)
printf("%d arg is: %.*s\n", i, hargs[i].l, hargs[i].p);
qsort(hargs, nargs, sizeof(struct pp), cmp);
putchar('\n');
for(i = 0; i < nargs; ++i)
printf("%d arg is: %.*s\n", i, hargs[i].l, hargs[i].p);

return 0;
}

https://rextester.com/GSH22767

关于c - 如何使用函数按字典顺序对分割命令行参数进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54774450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com