我正在尝试比较if
语句中的字符,然后在字母表中打印其位置的值。
我的代码是:
char a = 'a';
int value = 0;
if(a == "A" || a == "a"){
value = 1;
}else if...
编译时我收到错误:warning: comparison between pointer and integer
if(a == "A" || a == "a"){
^
我得到的字符在 C 中存储为ASCII值,这意味着我可能会使用字符的整数值而这会起作用,但我想知道为什么不这样做? / p>
答案 0 :(得分:7)
使用单引号:
if(a == 'A' || a == 'a' ){
双引号用于字符串文字。比较a == "A"
时,将字符a
与指针进行比较(即表达式中使用的字符串文字产生指向其第一个元素的指针)。因此,编译器发出诊断。它与"a"
相同。
答案 1 :(得分:3)
"a"
不是字符,而是字符串文字。
字符串本质上是以'\0'
(空字符)结尾的字符数组。
您需要改为使用'a'
。
此外,没有必要使用这么多 if-else s
你可以用很短的代码来完成它:
if(a >= 'a')
a-=('a'-'A');
value = a - 'A' + 1;
答案 2 :(得分:2)
查看变量a
的定义以及如何查看其初始化程序
char a = 'a';
并将初始化程序与if语句中使用的文字进行比较
if(a == "A" || a == "a"){
肉眼可以看到'a'
和"a"
看起来不一样。确实他们有不同的类型。
'a'
是一个字符文字,类型为int
。
"a"
是一个字符串文字,其类型为char[2]
,因为它包含两个字符'a'
和终止零'\0'
您可以想象字符串文字的定义,如
char string_literal_a[2] = { 'a', '\0' };
没有从数组(字符串文字)到int(字符文字)的隐式转换。
因此在本声明中
if(a == "A" || a == "a"){
字符串文字的字符数组“A”和“a”被转换为指向类型为char *
的表达式的第一个元素的指针,并且编译器发出警告,因为它怀疑您正在尝试执行此操作什么是错的,至少不是你想要的实际......
正确的条件可以按以下方式编写
if ( a == 'A' || a == 'a' ) {
如果表达式的结果是字符,则可以在条件中使用数组,但仅作为表达式使用下标运算符。例如
if ( a == "A"[0] || a == "a"[0] ){
或
if ( a == *"A" || a == *"a" ){
然而,尽管这些记录是正确的,但却让读者感到困惑。所以最好使用带有字符文字的记录
if ( a == 'A' || a == 'a' ) {
`
答案 3 :(得分:0)
您可以使用以下语法:
char a = 'a';
int value = 0;
if(a == 'A' || a == 'a')
{
value = 1;
}
错误是由于检查字符('x')和“字符串”之间的相等性而产生的。
相反,您可以将a
声明为char[]
(字符串),然后使用strcmp(str1,str2)
函数在value
中返回int:
value = strcmp(str1,str2);
此函数返回如下值:
如果返回值< 0然后它表示str1小于str2。
如果返回值> 0然后它表示str2小于str1。
如果返回值= 0则表示str1等于str2。
答案 4 :(得分:0)
#include <stdio.h>
int main(){
char a;
int value = 0;
printf("enter the character ");
scanf("%c",&a);
if(a == 'A' || a == 'a'){
value = 1;
printf("hi");
}
else {
printf("hello");
}
}