我在比较两个角色时遇到了麻烦。我写了一个非常基本的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”,性别)进行检查,得到的值为0.是否g =='f'是比较两个字符的错误方法?
答案 0 :(得分:16)
gender
是char*
,即指向字符串第一个charadcter的指针。将它与单个char
进行比较时,char
和指针都将转换为整数,并进行整数比较。
要比较字符串,请使用strcmp
中的<string.h>
:
if (strcmp(gender, "f") == 0)
// it's a girl
请注意双引号("
)表示字符串,而不是单个字符。
答案 1 :(得分:4)
答案 2 :(得分:4)
您首先将性别声明为字符串:
char *gender = "";
然后您将以后视为单个字符:
if(gender == 'f')
[...]
if(gender == 'b')
在尝试编写代码之前,您需要在自己的脑海中澄清gender
是什么
选择一个定义,并坚持下去。
答案 3 :(得分:3)
问题是您要将字符串(或更确切地说是char*
)与char
进行比较。该比较(即if(gender == 'f')
)将原始指针值与字符进行比较,而不是将字符串的内容与字符进行比较。相反,您需要取消引用指针,然后将该值或索引与字符串进行比较,即if(gender[0] == 'f')
。
当然,在尝试之前检查字符串实际上是否包含某些内容以避免段错误也是一个好主意。