C 使用if/else语句检查枚举参数是否存在

C 使用if/else语句检查枚举参数是否存在,c,enums,arguments,C,Enums,Arguments,我的当前代码有一个小问题,在尝试继续程序之前,我试图检查参数是否已传递给enum enum arg {argName, sineArg, sampleArg, argC}eargs; int main(int argc, char *argv[]){ long samplingRate = atol(argv[sampleArg]); float sineFreq = atof(argv[sineArg]); if (argC < eargs ){

我的当前代码有一个小问题,在尝试继续程序之前,我试图检查参数是否已传递给enum

 enum arg {argName, sineArg, sampleArg, argC}eargs;

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

    long samplingRate = atol(argv[sampleArg]);
    float sineFreq = atof(argv[sineArg]);
    if (argC < eargs ){
        printf("Usage: sineFreq\tsamplingRate\n");
    }else{}
  }
enum arg{argName,sineArg,sampleArg,argC}eargs;
int main(int argc,char*argv[]){
长采样光栅=原子(argv[sampleArg]);
float sineFreq=atof(argv[sineArg]);
如果(argC

代码可以很好地编译,尽管在没有参数的情况下运行时,程序返回“Segmentation fault:11”,而不是我要打印到控制台的用法消息。

您必须在访问
argv[…]之前进行检查。

编辑:检查本身也是错误的(
eargs
未定义;您应该编写

int main(int argc, char *argv[]) {
    if (argc < argC)         /* --> you should change you naming conventions! */
        return EXIT_FAILURE;

    long samplingRate = atol(argv[sampleArg]);
intmain(intargc,char*argv[]){
如果(argc您应该更改命名约定*/
返回退出失败;
长采样光栅=原子(argv[sampleArg]);

您需要将
argC
更改为
argC
,在if语句中…c区分大小写!!!

您的使用检查是针对与传递的命令行参数数量无关的
eargs
进行的。无论传递多少个参数,
eargs
始终是
0

在使用任何命令行参数之前,也应该进行检查。将条件放在
main()
的开头:

#包括
#包括
枚举arg{argName,sineArg,sampleArg,argC}eargs;
int main(int argc,char*argv[]){
/*如果(argc<3)在这里是明确的*/
如果(argc

在使用
printf()

 long samplingRate = atol(argv[sampleArg]);

访问argv[2],这是未定义的行为,因为您没有提供足够的arg(只有argv[0]=程序名,argv[1]=NULL表示argv[]的结束).

我已经快速地修改了代码,编译工作正常,但它仍然只是将相同的消息返回到控制台。您是说“main”中的“argc”声明吗?我刚刚将其全部更改为相同的('argc')它仍然向控制台返回相同的消息我想我误解了最后一个enum参数的用法,您基本上只需检查enum中最后一个参数的索引中有多少个参数?是的。如果您没有为enum分配任何值,则它们从
0
开始。它的工作原理就像您用:
enum>定义它一样{argName=0,sineArg=1,sampleArg=2,argC=3}eargs;
但是如果以后插入更多元素enum,则
argC
将不同。例如,如果这样做:
enum arg{argName,sineArg,newArg,sampleArg,argC}eargs;
那么
argC
现在将是4。
 long samplingRate = atol(argv[sampleArg]);