2015-07-14 3 views
1

Следующий код полностью одобрен в C, но не на C++. В следующем коде if утверждение всегда неверно. Как C сравнивает переменную символа с строкой?Как c сопоставить переменную символа со строкой?

int main() 
{ 
    char ch='a'; 
    if(ch=="a") 
    printf("confusion"); 
    return 0; 
} 
+2

Включить предупреждения компилятора. – Olaf

ответ

5

Следующий код полностью нормально в C

Нет, не совсем.

В коде

if(ch=="a") 

, по существу, пытается сопоставить значение ch с базовым адресом строки буквального "a",. Это смысл и использование.

То, что вы хотите здесь, чтобы использовать одиночные кавычки (') для обозначения char буквальным, как

if(ch == 'a') 

Примечание 1:

Чтобы уточнить разницу между сингл котировки для char литералов и двойных котировок для строка литерала s,

Для char буквальных, C11, глава §6.4.4.4

Константа числа символов представляет собой последовательность из одного или нескольких многобайтовых символов, заключенных в одиночных кавычках, как в 'x'

и, для строки буквальным, глава §6.4.5

Acharacter строковый литерал представляет собой последовательность нуля или более многобайтные символы, заключенные в двойные кавычки, как в "xyz".


Примечание 2:

Тем не менее, как примечание, то рекомендуем подпись main() является int main(void).

2

Существует разница между 'a' (иероглиф) и "a" (строка, имеющей два символа a и \0). ch=="a" сравнение будет оцениваться до false, потому что в этом выражении "a" преобразуется в указатель на его первый элемент и, конечно, этот адрес не является символом, а шестнадцатеричным числом.

Изменить его

if(ch=='a') 
2

Я бы не сказал, что код в порядке на любом языке.

'a' - это один символ. Это на самом деле небольшое целое число, имеющее в качестве значения значение данного символа в наборе символов машины (почти всегда ASCII). Так 'a' имеет значение 97, как вы можете увидеть, запустив

char c = 'a'; 
printf("%d\n", c); 

"a", с другой стороны, является строкой. Это массив символов, заканчивающийся нулевым символом. В C массивы почти всегда упоминаются указателями на их первый элемент, поэтому в этом случае строковая константа "a" действует как указатель на массив из двух символов: 'a' и завершающий '\0'. Вы можете видеть, что, запустив

char *str = "a"; 
printf("%d %d\n", str[0], str[1]); 

Это напечатает

97 0 

Теперь мы не знаем, где в памяти компилятор выберет поставить нашу строку, поэтому мы не знаем, что значение указателя будет, но можно с уверенностью сказать, что оно будет никогда не будет равно 97. Таким образом, сравнение if(ch=="a") всегда будет ложным.

Если вам нужно сравнить символ и строку, у вас есть два варианта. Вы можете сравнить характер первого символа строки:

if(c == str[0]) 
    printf("they are equal\n"); 
else printf("confusion\n"); 

Или вы можете построить строку из символа, и сравните это. В C, это может выглядеть следующим образом:

char tmpstr[2]; 
tmpstr[0] = c; 
tmpstr[1] = '\0'; 

if(strcmp(tmpstr, str) == 0) 
    printf("they are equal\n"); 
else printf("confusion\n"); 

Это ответ на C. Там есть другой, более мощный тип строки в C++, так что все будет по-другому на этом языке.