簡體   English   中英

C中的switch語句和getopt()函數

[英]switch statement and getopt() function in C

我正在嘗試使用switchgetopt()解析命令行中的參數。 結構非常簡單:我有一個makefile.c.h文件。 這是我第一次使用switch,因此我可能會犯一些基本錯誤。 我已使用此鏈接作為指導來切換鏈接文本鏈接文本,如果您發現任何基本錯誤,請告訴我。

生成文件:

make:lunar

lunar: lunar.o
    gcc -Wall -std=c99 -g -o lunar lunar.o -lm
lunar.o: lunar.c lunar.h
    gcc -Wall -std=c99 -g -c lunar.c

clean:
    -rm -f *.o lunar core

/////////////////////////////////////

lunar.c

int main (int argc,  char *argv[]){
    int i;
    int c = 0;
    int gravity = 0;
    int thrust = 0;
    opterr = 0;
    while ((c = getopt (argc, argv, "gtf:")) != -1)
        switch (c){
            case 'g':
                gravity = argv[optind];
                break;
            case 't':
                thrust = argv[optind];
                break;
            case 'f':
                argument = argv[optind];
                break;
            case '?':
                if (optopt == 'c')
                    fprintf(stderr, "Option -%c requires 
                            an argument.\n", optopt);
                else if (isprint (optopt))
                    fprintf (stderr, "Unknown option 
                             `-%c'.\n", optopt);
                else
                    fprintf (stderr, "Unknown option 
                             character `\\x%x'.\n", 
                             optopt);
                return 1;
            defult:
                abort ();
        }
    printf ("gravity is %d and thrust is %d.\n", 
            gravity, thrust);
    for (int index = optind ; index < argc ; index++ ){
        printf ("Non-option argument %s\n", argv[index]);
        return 0;
    }
}

///////////////////////////////////

lunar.h

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#include <assert.h>

#define MAX_WORD 256

別忘了' default '里面有一個' defult您剛剛用(未使用的)標簽defult標記了該代碼,而不是給開關設置了默認大小寫。

目前尚不清楚為什么您認為optopt可能是'c'或當它是'c'時應被特殊對待; 它可能是較早版本的宿醉。

您正在處理'g'和't'選項,就像它們接受參數一樣,但是對getopt()的調用不會在它們之后列出冒號。 如果要相信該開關,則需要將參數設為"g:t:f:"

另外,您應該使用名為optargchar *而不是嘗試使用argv[optind] 循環完成后,您可以使用optind處理其他(“文件名”)參數。

另外,由於gravitythrust是整數,因此您需要將字符串轉換為整數。 最簡單的方法(主要忽略可能的錯誤)是:

gravity = atoi(optarg);

如果要執行錯誤處理,請調用一個函數進行檢查和錯誤報告。

我建議將括號放在switch語句或while語句的主體周圍:

while ((c = getopt(argc, argv, "g:f:t:")) != -1)
{
    switch (c)
    {
    ...
    }
}

並非絕對必要,但是(IMNSHO)帶有大括號的代碼更容易閱讀。 對於單行語句,我不會有問題。 但是對於像switch這樣的復雜語句,我建議使用大括號。

' return 0; '應該在for循環之外。 此刻,循環在第一個非選項參數上停止。


生成文件基本上很好。 最終,您將使用更多的宏和更多的編譯警告標志,但是我發現編譯器還會發現的唯一問題是默認情況下的錯字和未將字符串轉換為整數的情況。

PROGRAM = lunar
SOURCE  = lunar.c
HEADER  = ${SOURCE:.c=.h}
OBJECT  = ${SOURCE:.c=.o}
CFLAGS  = -std=c99 -Wall -g
LDFLAGS =
LDLIBS  = -lm

all: ${PROGRAM}

${PROGRAM}: ${OBJECT}
    ${CC} ${CFLAGS} -o $@ ${OBJECT} ${LDFLAGS} ${LDLIBS}

${OBJECT}: ${SOURCE} ${HEADER}
    ${CC} ${CFLAGS} -c ${SOURCE}

clean:
    -rm -f *.o ${PROGRAM} core

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM