getopt不适用于一个参数

这只是我编写的一个简单程序,以便使用getopt和structs进行一些练习。

typedef struct { int age; float body_fat; } personal; typedef struct { const char *name; personal specs; } person; int main(int argc, char *argv[]) { char c; person guy; while((c = getopt(argc, argv, "n:a:b:")) != -1) switch(c) { case 'n': guy.name = optarg; break; case 'a': guy.specs.age = atoi(optarg); break; case 'b': guy.specs.body_fat = atof(optarg); break; case '?': if(optopt == 'a') { printf("Missing age!\n"); } else if (optopt == 'b') { printf("Missing body fat!\n"); } else if (optopt == 'n') { printf("Missing name!\n"); } else { printf("Incorrect arg!\n"); } break; default: return 0; } printf("Name: %s\nAge: %i\nFat Percentage: %2.2f\n", guy.name, guy.specs.age, guy.specs.body_fat); return 0; } 

除了“b”选项外,一切正常。 由于某种原因指定一个不会改变任何东西。 它总是返回0.0。 如果其他args工作得很好,我不明白为什么会这样。

您的示例缺少将声明相应原型的头文件。 添加这些

 #include  #include  #include  #include  

让它适合我。 我还将c的类型更改为int (char不会保持-1),并且执行了

 memset(&guy, 0, sizeof(guy)); 

只是为了确保它是一个已知值。 编译器警告是你的朋友。 我用这个(一个名为gcc-normal的脚本)来应用警告:

 #!/bin/sh # $Id: gcc-normal,v 1.4 2014/03/01 12:44:54 tom Exp $ # these are my normal development-options OPTS="-Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion" ${ACTUAL_GCC:-gcc} $OPTS "$@" 

虽然RCS标识符是最新的,但它是我在构建中使用的旧脚本。