web-dev-qa-db-ja.com

C-2つの文字の比較

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つの文字を比較する間違った方法ですか?

8
tenkii

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

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

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

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

16
Fred Foo

あなたが持っている:

char *gender = "";

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

4
Shahbaz

最初に性別を文字列として宣言しました:

char *gender = "";

その後、後で単一の文字として扱います:

if(gender == 'f')
   [...]
if(gender == 'b')

コーディングを試みる前に、genderが何であるかを自分の心で明確にする必要があります。
定義を1つ選択して、それを使用します。

4
abelenky

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

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

3
slugonamission