0

switchとを使用してコマンドラインの引数を解析しようとしていますgetopt()。構造は非常に簡単です。私には、、、makefileおよび.cファイルがあり.hます。スイッチを使うのは初めてなので、基本的なミスをしているのかもしれません。このリンクをガイドとして使用して、リンクテキストリンクテキストを切り替え ました。基本的な間違いを見つけた場合は、お知らせください。

makefile:

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
4

1 に答える 1

4

''には'a'が含まれていることを忘れないでください。スイッチにデフォルトのケースを指定するのではなく、defaultそのコードに(未使用の)ラベルを付けただけです。defult

optoptなぜ「c」である可能性があるのか​​、または「c」である場合に特別に扱われるべきであると考えるのかは明確ではありません。以前の版からの二日酔いかもしれません。

'g'および't'オプションを引数を取るかのように処理していますが、toの呼び出しでgetopt()は、それらの後にコロンがリストされていません。スイッチが信じられるべきであるならば、あなたは引数がである必要があります"g:t:f:"

また、を使用する代わりに、 char *calledを使用する必要があります。ループが終了した後に、追加の(「ファイル名」)引数を処理するために使用します。optargargv[optind]optind

また、gravitythrustは整数であるため、文字列を整数に変換する必要があります。簡単な方法(考えられるエラーをほとんど無視する)は次のとおりです。

gravity = atoi(optarg);

エラー処理を行う場合は、関数を呼び出してチェックとエラー報告を行います。

switchステートメントまたはステートメントの本文を中かっこで囲むことをお勧めしますwhile

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

厳密に必要というわけではありませんが、中括弧を追加すると(IMNSHO)コードが読みやすくなります。1行のステートメントの場合、問題はありません。ただし、スイッチのような複雑なステートメントの場合は、中括弧を追加することをお勧めします。

' 'はループreturn 0;の外側にある必要があります。for現時点では、ループは最初の非オプション引数で停止します。


makefileは基本的に問題ありません。最終的には、より多くのマクロとコンパイル警告フラグを使用することになりますが、コンパイラーも検出する問題は、デフォルトの場合のタイプミスと文字列の整数への非変換だけでした。

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
于 2010-11-26T04:35:26.020 に答える