C语言 - 比较两个字符

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'是比较两个字符的错误方式吗?


2
类似 char *type = ""; 的定义是只读的,也就是说,一旦声明了 type,你就不能直接将字符串赋值给它。请阅读此文档 - http://msdn.microsoft.com/en-us/library/8kc54dd5(v=vs.80).aspx - Nobilis
1
打开编译器警告(例如使用GCC的“-Wall”选项),这样类似的错误就会很容易被发现。 - interjay
3
你可以将事物分配给“type”。你不能写入指向的值,但OP没有这样做。 - interjay
1
@Nobilis:它们并不相同。字符串字面量是只读的,而char*变量则不是。 - Fred Foo
1
应该将 ch 声明为 int,否则在某些平台上可能无法正确处理 EOF - JeremyP
显示剩余5条评论
4个回答

16

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

要比较字符串,请使用<string.h>中的strcmp

if (strcmp(gender, "f") == 0)
    // it's a girl
请注意双引号(")代表字符串而不是单个字符。

4
Strcmp函数在比较单个字符时有些过度。 - slugonamission
3
相较于写 gender[0] == 'f' && gender[1] == '\0',写法更简单。如果与短字符串文字一起使用,它可能会被内联,而且在该程序中性能并不是非常关键。 - Fred Foo

3
你首先将性别声明为字符串:
char *gender = "";

然后你可以将其视为单个字符处理:
if(gender == 'f')
   [...]
if(gender == 'b')

在尝试编码性别之前,您需要在自己的思想中明确性别是什么。
选择一个定义,坚持使用它。


3
问题在于您正在将一个字符串(或者说是char*)与一个char进行比较。这种比较(即if(gender == 'f'))会将原始指针值与字符进行比较,而不是将字符串内容与字符进行比较。相反,您需要解引用指针,然后再进行比较,或者索引字符串,例如if(gender[0] == 'f')
当然,在尝试进行比较之前,最好检查字符串实际包含了什么,以避免出现段错误。

1
如果 gender 是以 'f' 开头的任何字符串,这将会产生错误的结果。 - interjay

3

你有:

char *gender = "";

因此,gender是一个字符串,而不是一个字符。要比较字符串,请使用strcmp


你没有解释为什么它是一个字符串而不是一个字符。 - kojow7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接