这只是我为了练习 getopt 和结构而编写的一个简单程序。
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。我不明白如果其他参数工作正常的话为什么会出现这种情况。
您的示例缺少声明相应原型的头文件。添加这些
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
让它对我有用。我还改变了类型c
to int
(一个字符不会持有-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 标识符是相当新的,但它是我在中使用的旧脚本builds http://invisible-island.net/scripts/buildscripts/CHANGES.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)