我有一个函数将月份的前3个字母转换为数字(Jan = 1,Feb = 2等)。
int convertDate(char date[3])
{
printf("%s", date);
if(date == 'Ian')
return 1;
else
if(date == 'Feb')
return 2;
else
if(date == 'Mar')
return 3;
else
if(date == 'Apr')
return 4;
else
if(date == 'Mai')
return 5;
else
if(date == 'Iun')
return 6;
else
if(date == 'Iul')
return 7;
else
if(date == 'Aug')
return 8;
else
if(date == 'Sep')
return 9;
else
if(date == 'Oct')
return 10;
else
if(date == 'Noi')
return 11;
else
if(date == 'Dec')
return 12;
else return 0;
}
但是,当我使用main()时:
printf("%d", convertDate("Ian"));
它返回0而不是1.相同的任何其他月份。有什么建议吗?
答案 0 :(得分:5)
比较strcmp()
时使用char*
。
if (date == "Sep")
会比较char*
的基地址。
答案 1 :(得分:2)
由于C字符串变量的类型为char *,因此比较字符串实际上会比较指针地址。请使用strcmp()
来比较字符串。
此外,您可以使用stricmp()
进行不区分大小写的字符串比较。
注意,您也可以使用循环实现您的函数,将所有12个固定字符串定义为数组(使用strncmp()以确保我们实际上只比较3个字符)
int convertDate(char date[3])
{
const char date_names[12][4] = {
"Ian", "Feb", "Mar", /* etc. */ };
int i;
for(i = 0; i < 12; ++i)
{
if (strncmp(date_names[i], date, 3) == 0)
return i+1;
}
return 0;
}
答案 2 :(得分:1)
您无法使用==运算符比较字符数组。查看strcmp函数。
答案 3 :(得分:1)
除非在非常具体的情况下,否则无法比较这样的字符串(不要担心)。
您应该使用strncmp
,“字符串比较”。 E.g:
#include <string.h>
然后
if(strncmp(date, "Ian", 3) == 0)
return 1;
请注意使用"
代替'
。使用'
是完全不同的,可以在堆栈上创建一个你不想要的多字节int值。
答案 4 :(得分:1)
那甚至不应该编译。您将char*
值(date
)与int
值('Ian'
)进行了比较。
此:
'Ian'
不是字符串文字。它是一个多字符字符常量,其值是实现定义的。使用它几乎没有意义。
我猜你发布的代码不是你编译的代码。这就是为什么你应该将你提供给编译器的相同代码复制并粘贴到你的问题中。
正如其他人所说,在比较字符串时,您需要使用strcmp()
,而不是==
- 这意味着您无法使用switch
语句。
您还应该知道参数声明
char date[3]
完全等同于
char *date
3
被悄悄忽略,如果您致电dateCompare("Ianxyzfoobar")
,date
将指向长度为12的字符串。
答案 5 :(得分:0)
您正在执行指针比较,而不是字符串比较。使用strcmp()
。