本文介绍了C-具有可变数量的参数和命令行参数的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要按字典顺序对 n 个字符串进行排序,这些字符串是具有可变数量参数的函数的参数。在 main 函数中,将字符串作为命令行参数读取。

I need to sort n number of strings lexicographically that are arguments of a function with variable number of arguments. In main function, strings are read as command line arguments.

这是我的代码:

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

void sort(int n,...)
{
    //store optional arguments (strings) to array arr
    va_list args;
    va_start(args,n);
    char **arr=malloc(n * sizeof(char*));
    int i;
    for(i=0;i<n;i++)
        arr[i]=malloc((strlen(va_arg(args,char*)) + 1) * sizeof(char));
    va_end(args);

    //store length of each string to lenArr
    //find max length and store it to temp (for sorting)
    va_list args;
    va_start(args,n);
    int *lenArr=calloc(n , sizeof(int));
    for(i=0;i<n;i++)
    {
        lenArr[i]=strlen(va_arg(args,char*)) + 1;
    }

    int max=0;
    for(i=0;i<n;i++)
    {
        if(lenArr[i] > lenArr[max])
            max=i;
    }
    int maxLen;
    maxLen=lenArr[max];
    char *temp=calloc(maxLen * sizeof(char));
    va_end(args);

    //sort array arr lexicographically
    int j,min;
    for(i=0;i<n-1;i++)
    {
        for(min=i,j=i+1;j<n;j++)
           if(strcmp(arr[j],arr[min]) < 0)
                min=j;
           if(min!=i)
           {
              strcpy(temp,arr[i]);
              strcpy(arr[i],arr[j]);
              strcpy(arr[j],temp);
           }
    }
}

int main(int argc,char **argv)
{
    int n=3;
    sort(n,argv[1],argv[2],argv[3]);//this works when n is pre-defined


    return 0;
}

如何阅读 n 字符串作为 main 函数中的命令行参数并按顺序打印它们吗?

How to read n strings as command line arguments in main function and print them sorted?

此外,我遇到了一个错误在函数 sort()-无链接的args的声明中

Also, I am am getting an error in function sort() - redeclaration of args with no linkage.

推荐答案

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

int cmp(const void *a, const void *b){
    return strcasecmp(*(char**)a, *(char**)b);
}

void sort(int n, char *str[n]){
    qsort(str, n, sizeof(char*), cmp);
}

int main(int argc, char *argv[]){
    sort(argc-1, argv+1);
    for(int i = 1; i < argc; ++i)
        puts(argv[i]);
    return 0;
}






执行示例:


Execution example:

>a.out a B c Z x y
a
B
c
x
y
Z

这篇关于C-具有可变数量的参数和命令行参数的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 20:13