8

我无法比较两个字符。我写了一个非常基本的 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 后,它应该是一个女孩。但我尝试通过 printf("%i", gender) 进行检查,它的值为 0。 g == 'f' 是比较两个字符的不正确方法吗?

4

4 回答 4

15

gender是 a char*,即指向字符串第一个字符的指针。当您将其与单个 进行比较时,charthechar和指针都将转换为整数并完成整数比较。

要比较字符串,请使用strcmpfrom <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 回答
3

您首先将性别声明为字符串:

char *gender = "";

然后您稍后将其视为单个字符:

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

gender在尝试编写代码之前,您需要先弄清楚自己的想法是什么。
选择一个定义,并坚持下去。

于 2013-06-10T14:39:45.637 回答