c - 在 C 中编程以读取参数

标签 c getopt

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

myfile -n name -a age -g grade 

所以当我调用它时,这将是有效的:myfile john 22 20 姓名年龄必填项。所以 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 中编程以读取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39337345/

相关文章:

c++ - 为什么 C 字 rune 字是 int 而不是 char?

c - 使用格式字符串打印返回地址

linux - getopt 不能像在 Linux 中那样在 AIX 上运行

c++ - 如何在 C++/C 中处理 getopt 平台依赖

perl - 如何使用 Getopt::Std 设置默认值?

c - 在 C 中打印系统名称?

c - 如何在没有空终止的情况下将十六进制值分配给 char 类型?

c - 建议使用 gcc 编译器替代 gets() 函数

c - 在 C 中使用 getopt 的问题

c - getopt 没有正确处理错误