使用argv元素时遇到麻烦

时间:2014-07-15 01:38:50

标签: c multithreading argv

我需要在argv中获取所有参数并将其用于不同的porpuse,程序条目将是这样的

./program -t <a number> -d <a string> -m < a char, e or l > 

IE:./program -t 10 -d have/a/nice/day -m e

我这样做是:

    int main(int argc, char *argv[]){
        int i,nt;
        char aux[6];


    for (i=0;i<6;i++){
        aux[i] = *((char*)argv[i+1]);
    }

    nt=(int)aux[1]-'0';
    printf("%d",nt);
    printf("%c",aux[1]);

    pthread_t threads[nt];
    if (aux[5]=='e'){

        printf("mode ejec\n");  
        /*for (i=0;i<nt;i++){
            pthread_create (&threads[i],NULL,(void *)operacion,NULL);   

        for (i=0;i<nt;i++){
            pthread_join (threads[i],NULL); 
        }
}*/

    }else if(aux[5]=='l'){

    printf("mode lib\n");

    }
    return 0;

}

但是当我在argv中占据任何位置时,只显示参数的第一个字符/数字

在示例中,它将显示:

[-,1,-,h,-,e]

我怎么能拿走所有的元素?

抱歉,如果我没有解释得那么好......英语不是我的主要语言

2 个答案:

答案 0 :(得分:0)

您正在将argv中的项目复制到char数组。您需要使用char *数组(如果您确实要复制argv,或者您可以自己使用argv

接受以特定顺序传递给您的程序的args似乎也不合适。你应该遵循迭代所有args的模式,当你遇到一个选项(例如-m)时,你选择下一个项作为选项值。

答案 1 :(得分:0)

仔细查看for循环。请记住,C风格的字符串是以null结尾的char数组。通过取消引用argv[i+1]给出的指针,您将获得该字符串的第一个字符。

那会有什么不同的目的?除特定情况外,您只需直接阅读argv即可。但是,如果你真的想单独存储它,你可以做类似

的事情
char *aux[6];
for (i=0;i<6;i++){
    aux[i] = argv[i+1];
}

使用不同数组中的指针。或者你也可以做

char *aux[6];
for (i=0;i<6;i++){
    aux[i] = strdup(argv[i+1]);
}

存储该数组中参数的副本(之后你需要free,因为strdup为新字符串分配内存)。修改argv指向的字符串也可以。

最后,我建议您阅读用于解析命令行选项的getopt库([1]和[2])。

[1] https://en.wikipedia.org/wiki/Getopt
[2] https://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html