在 C 中编程以读取参数

Program in C to read arguments

我开始学习 C,我想创建一个程序,该程序将采用 2 个强制参数和 1 个可选参数。 ` 这个问题听起来很初级,但我很难理解。 所以基本上我想做的是这样调用程序:

myfile -n name -a age -g grade 

所以当我调用它时,这将是有效的:myfile john 22 20 Nameageobligatory。所以 name 是一个字符串, age 是一个介于 0 和 100 之间的数字。 而 gradeoptional 并且可以是一个数字。如果未定义,则其值为 0。

我试过这样做:

int main(int argc, char **argv){

    FILE *fp;
    char *filename = "student.txt";

    char name;
    int age, grade;
    if( (fp = fopen(filename, "w")) == NULL) {
        // show error 
        printf("Error."); 
     }
    if(argc!=2)
    {
        printf("Error.");
        return;
    }
    int ich = 0;
    while ((ich = getopt (argc, argv, "abc")) != -1) {
        switch (ich) {
            case 'a': 
                name = argv[1];
                break;
            case 'b': 
                age = argv[2];  
                if not (age >= 0 && age<100) {
                    printf("Error."); 
                }
                break;
            case 'c': 
                grade = argv[3];
                if (grade == NULL) {
                    grade = 0;
                }
                break;
            default: 
                break;
        }
  }

我想使用指针 optarg 来访问参数。 我收到此错误 warning: assignment makes integer from pointer without a cast [-Wint-conversion] 我真的需要帮助。拜托,有人可以帮助我吗?我真的需要帮助。 :(

这里是my tutorialspoint fiddle

经过讨论等,我根据问题中的代码创建了这段代码:

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

static char *arg0 = 0;
static void usage(void)
{
    fprintf(stderr, "Usage: %s -n name -a age [-g grade]\n", arg0);
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{
    FILE *fp;
    char *filename = "student.txt";
    char *name = 0;
    int age = 0;
    int grade = 22;

    arg0 = argv[0];

    int opt;
    while ((opt = getopt(argc, argv, "n:a:g:")) != -1)
    {
        switch (opt)
        {
        case 'n':
            name = optarg;
            break;
        case 'a':
            age = atoi(optarg);
            if (age <= 0 || age >= 100)
            {
                fprintf(stderr, "Age '%s' out of range 1..99\n", optarg);
                usage();
            }
            break;
        case 'g':
            grade = atoi(optarg);
            break;
        default:
            break;
        }
    }

    if (name == 0)
    {
        fprintf(stderr, "You did not specify a name\n");
        usage();
    }
    if (age == 0)
    {
        fprintf(stderr, "You did not specify an age\n");
        usage();
    }
    if (optind != argc)
    {
        fprintf(stderr, "Extra arguments provided (starting with '%s')\n", argv[optind]);
        usage();
    }

    // check if file exists
    if ((fp = fopen(filename, "w")) != NULL)
    {
        printf("%s, %d, %d\n", name, age, grade);
        fprintf(fp, "%s, %d, %d\n", name, age, grade);
        fclose(fp);
    }
    else
    {
        fprintf(stderr, "Failed to open file '%s' for writing\n", filename);
        return 1;
    }
    return 0;
}

示例运行

程序名称:go59

$ go59
You did not specify a name
Usage: go59 -n name -a age [-g grade]
$ go59 -n Rita
You did not specify an age
Usage: go59 -n name -a age [-g grade]
$ go59 -n Rita -a 23
Rita, 23, 22
$ go59 -n Andromeda -a 23 -g 97
Andromeda, 23, 97
$ go59 -n Andromeda -a 23 -g 97 apoplexy
Extra arguments provided (starting with 'apoplexy')
Usage: go59 -n name -a age [-g grade]
$ go59 -n Andromeda -a 23 -g 97 --
Andromeda, 23, 97
$ go59 -n Andromeda -a -1 -g 97 --
Age '-1' out of range 1..99
Usage: go59 -n name -a age [-g grade]
$ go59 -n Andromeda -a 0 -g 97 --
Age '0' out of range 1..99
Usage: go59 -n name -a age [-g grade]
$

请注意,在知道所提供的参数足够有效之前,代码不会删除 student.txt 文件。

欢迎来到C。关于C最重要的理念是不要重新发明轮子。您正在寻找的参数样式是 GNU 标准。也就是说,GNU 已经编写了所有 C 代码来为您完成这项工作(就解析 argc 和 argv 而言)。查看 GNU 的 getopt 共享库。如果您在 Linux,那么您已经拥有它了。