2010-03-13 2 views
8

У меня есть две переменные:Сравните равенство полукокса [] в C

char charTime[] = "TIME"; 
char buf[] = "SOMETHINGELSE"; 

Я хочу, чтобы проверить, если эти два равны ... используя charTime == buf не работает.

Что я должен использовать, и может ли кто-нибудь объяснить, почему использование == не работает?

Будет ли это действие отличаться на C и C++?

+0

btw: 'char []' является неполным типом. 'charTime' на самом деле имеет тип' char [5] 'и' buf' на самом деле имеет тип 'char [14]'. В этом случае компилятор рассчитывает завершить этот тип. – sellibitze

ответ

17
char charTime[] = "TIME"; char buf[] = "SOMETHINGELSE"; 

C++ и C (удалить std:: для C):

bool equal = (std::strcmp(charTime, buf) == 0); 

Но истинный C++ путь:

std::string charTime = "TIME", buf = "SOMETHINGELSE"; 
bool equal = (charTime == buf); 

Использование == не работает, потому что он пытается сравните адреса первого символа каждого массива (очевидно, они не равны). Он не будет сравнивать содержимое обоих массивов.

+0

Это связано с тем, что C++ допускает перегрузку оператора, которая перегружает '==' для фактического сравнения содержимого, а не «по умолчанию» 'char []' '' '' '' ', который является сравнительным сравнением. – Pindatjuh

+0

Вам не нужно было #define ваш тип bool для C также? – zellio

+0

@mim: C99 имеет тип 'bool'. Поэтому вам, вероятно, нужно будет определить его только с помощью MSVC. – Joey

0

Проверьте их в петле цикла. Получите номера ASCII для каждого символа, как только они меняются, они не равны.

+0

Это самый простой способ сделать это? Должно быть, что-то лучше? – rksprst

+0

Существует ссылка на сообщение Йоханнеса Шауба - litb. – 2010-03-13 23:27:13

3

В с вы можете использовать функцию STRCMP из string.h, она возвращает 0, если они равны

#include <string.h> 

if(!strcmp(charTime, buf)) 
0

Вы проверки идентичности charTime и buf. Чтобы проверить равенство, зациклируйте каждый символ в одном массиве и сравните их со связанным символом в другом массиве.

+0

или использовать strcmp ... – lajuette

1

В выражении, использующем ==, имена char массивов распадаются на char*, указывая на начало их соответствующих массивов. Затем сравнение выполняется в терминах значений самих указателей, а не фактического содержимого массивов.

== будет возвращать true только для двух указателей, указывающих на одно и то же место, и false в противном случае, даже если они указывают на два массива с одинаковым содержимым.

Что вам нужно, это стандартная функция библиотеки strcmp. Это выражение оценивается как истинное, если массивы содержат одно и то же содержимое (вплоть до конечного нулевого символа, который должен присутствовать в обеих массивах для strcmp для безопасной работы).

strcmp(charTime, buf) == 0 
Смежные вопросы