8

2 つの文字を比較するのに問題があります。コマンド ライン引数を試すために、非常に基本的な C の問題を作成しました。

これまでの私のコードは次のとおりです。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char ch;
    char *type = "";
    char *gender = "";
    int baby = 0;
    int count = 0;

    /* Options:
     * -t = type of pet
     * -g = gender
     * -b = baby or adult
     */
    while ((ch = getopt(argc, argv, "t:g:b")) != EOF)
        switch (ch) {
            case 't':
                type = optarg;
                break;
            case 'g':
                gender = optarg;
                break;
            case 'b':
                baby = 1;
                break;
            default:
                fprintf(stderr, "Invalid option.\n");
                return 1;
        }

    argc -= optind;
    argv += optind;

    printf("You have chosen a %s.\n", type);
    if (gender == 'f')
        puts("It's a girl");
    if (gender == 'b')
        puts("It's a boy.");

    // The main command line arguments should be about the traits of the pet
    printf("%s", "Traits: ");
    for (count = 0; count < argc; count++)
        printf("%s ", argv[count]);

    return 0;
}

したがって、これを端末に入力すると:

  $ ./pet_shop -t dog -g f cute small

これを出力として取得します:

  You have chosen a dog:
  Traits: cute small

出力には性別に関する情報がありません。f と入力したため、女の子である必要があります。しかし、値0を与えたprintf( "%i"、gender)でチェックしようとしました.g == 'f'は2つの文字を比較する間違った方法ですか?

4

4 に答える 4

15

genderつまりchar*、文字列の最初の文字へのポインタです。それを単一の と比較すると、 とポインターcharの両方がchar整数に変換され、整数の比較が行われます。

文字列を比較するには、 from を使用strcmp<string.h>ます。

if (strcmp(gender, "f") == 0)
    // it's a girl

"単一の文字ではなく文字列を表す二重引用符 ( ) に注意してください。

于 2013-06-10T14:37:20.357 に答える
3

問題は、文字列 (または a char*) を aと比較していることですchar。この比較 (つまりif(gender == 'f')) は、文字列の内容を文字と比較するのではなく、生のポインター値を文字と比較します。代わりに、ポインターを逆参照してから、その値を比較するか、文字列にインデックスを付ける必要がありますif(gender[0] == 'f')

もちろん、セグメンテーション違反を回避するために、文字列に実際に何かが含まれているかどうかを確認することもお勧めします。

于 2013-06-10T14:36:30.353 に答える
3

あなたが持っている:

char *gender = "";

文字genderではなく文字列も同様です。文字列を比較するには、 を使用しますstrcmp

于 2013-06-10T14:37:09.937 に答える