【问题标题】:C - Function with variable number of arguments and command line argumentsC - 具有可变数量的参数和命令行参数的函数
【发布时间】:2016-09-20 21:16:53
【问题描述】:

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

这是我的代码:

#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;
} 

如何在main 函数中读取n 字符串作为命令行参数并将它们排序打印?

另外,我在函数 sort() - redeclaration of args with no linkage 中遇到错误。

【问题讨论】:

  • 你的意思是命令行参数还是用户输入?
  • @ChiefTwoPencils,命令行参数。
  • 你做不到——好吧,不是没有敲诈勒索的痛苦和一个特殊的图书馆。将数组从命令行传递到修改后的排序函数,该函数接受一个数组。然后,原始代码可以使用这个其他函数对其从变量参数列表创建的数组进行排序。基本问题是您无法在运行时在函数调用参数列表中构建可变数量的参数。 (但还不清楚您的排序函数在做什么。它对一些数据进行排序,但对排序后的数据没有任何作用。)
  • 只要知道你不想要第一个就传递参数数组;容易。
  • 我的意思是,如果不写出这样的替代方案,就很难模拟sort(3,argv[1],argv[2],argv[3]);sort(4,argv[1],argv[2],argv[3],argv[4]); 的效果。 OTOH,调用sort_alternative(argc-1, argv+1); 是微不足道的——如我目前看到的答案所示。

标签: c command-line-arguments


【解决方案1】:
#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;
}

执行示例:

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

【讨论】:

  • 稍微解释一下会更好
  • @BLUEPIXY,您没有使用可变数量的参数。
  • @ufo 如果您使用argcargv 作为命令行参数,则不需要。 (另外即使有带可变参数的函数,也不可能在运行时传递可变参数。)
猜你喜欢
  • 2013-01-29
  • 1970-01-01
  • 2011-12-24
  • 2023-03-12
  • 1970-01-01
  • 2013-02-09
  • 2021-04-29
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多