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つの文字を比較する間違った方法ですか?
gender
はchar*
、つまり文字列の最初の文字へのポインターです。これを単一のchar
と比較すると、char
とポインターの両方が整数に変換され、整数の比較が行われます。
文字列を比較するには、<string.h>
のstrcmp
を使用します。
if (strcmp(gender, "f") == 0)
// it's a girl
単一の文字ではなく、文字列を表す二重引用符("
)に注意してください。
最初に性別を文字列として宣言しました:
char *gender = "";
その後、後で単一の文字として扱います:
if(gender == 'f')
[...]
if(gender == 'b')
コーディングを試みる前に、gender
が何であるかを自分の心で明確にする必要があります。
定義を1つ選択して、それを使用します。
問題は、文字列(または_char*
_)をchar
と比較していることです。この比較(つまり、if(gender == 'f')
)は、文字列の内容を文字と比較する代わりに、生のポインター値を文字と比較します。代わりに、ポインターを逆参照し、その値を比較するか、文字列のインデックス、つまりif(gender[0] == 'f')
を使用する必要があります。
もちろん、セグメンテーション違反を回避するために、文字列に実際に何かが含まれていることを確認してから、それを試みることをお勧めします。