【问题标题】:C- Arguments inputC- 参数输入
【发布时间】:2016-05-10 14:31:49
【问题描述】:

有没有更好的方法来接受输入, 例如: ls = 列出当前目录中的所有文件... cat Q1.c 将显示等

在我看来,我现在正在努力编写代码

int main(int argc, char *argv[])
{    
    int i;
    char *dest = NULL;
    if(argc==1) {
        printf( "No arguments were passed.\n" );
    } 
    else {
        printf("Arguments:\n");
        for(i=1;i<argc;++i) {
            printf("%d. %s\n", i, argv[i]);
            dest = malloc(strlen(argv[i])+1);
            if(i<2) {
                sprintf(dest, "%s",argv[i]);    
            }
            else {
                sprintf(dest, "%s %s", argv[i-1], argv[i]); 
            }
        }   
        mysystem(dest);
    }
    return 0;
}

【问题讨论】:

  • 看看 getopt_long 标准库调用
  • 我不知道你的问题是什么。
  • 你没有为sprintf(dest, "%s %s", argv[i-1], argv[i]);分配足够的内存,注意:每个循环都会用另一个内存分配覆盖dest,所以你不能free之前的任何一个。

标签: c


【解决方案1】:

您没有为mysystem 建立缓冲区。这是工作代码[请原谅无偿的风格清理]:

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

int
main(int argc, char *argv[])
{
    int i;
    char *dest = NULL;
    char *dp;
    char *av;
    int totlen;
    int len;

    if (argc == 1) {
        printf("No arguments were passed.\n");
    }

    else {
        // get total amount of space we'll need
        totlen = 0;
        for (i = 1; i < argc; ++i) {
            av = argv[i];
            len = strlen(av);
            totlen += len + 1;
        }

        dest = malloc(totlen + 1);
        dp = dest;
        *dp = 0;

        printf("Arguments:\n");
        for (i = 1; i < argc; ++i) {
            av = argv[i];

            printf("%d. %s\n", i, av);

            if (i > 1)
                *dp++ = ' ';

            strcpy(dp,av);
            dp += strlen(av);
        }

        system(dest);
    }

    return 0;
}

【讨论】:

  • 不客气!我希望您的原始代码和我的调整之间的差异足够清楚,以便您了解我做了什么以及为什么。无论如何,快乐编程!
【解决方案2】:

正如 Bruce 在 cmets 中所说的那样,我猜您正在为这个选项寻找一个快速解析器。 getopt()getopt_long() 可以让您轻松解析您的论点,但请注意这些是 POSIX 的成员!


getopt(): ./example -a udp://127.0.0.1:8000

getopt_long(): ./example --address=udp://127.0.0.1:8000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-01-16
    相关资源
    最近更新 更多