ошибка C2664: 'strcmp': невозможно преобразовать параметр 2 из 'char' в 'const char *' - PullRequest
1 голос
/ 28 марта 2011

Мне нужна помощь по этому сценарию.

BOOL Checking(LPCSTR MacID) {
    char ClientMacs[18] = { "11:22:33:44:55:66",};

    for(int x=0; x < 10; x++) {
        if(!strcmp(MacID, ClientMacs[x])) {
            printf(MacID," Successed!");
            return true;
        }
    }

    return false;
}

Я получаю

ошибка C2664: 'strcmp': невозможно преобразовать параметр 2 из 'char' в 'constchar * 'Преобразование из целочисленного типа в тип указателя требует reinterpret_cast, приведение в стиле C или приведение в стиле функции

, когда я пытаюсь его скомпилировать.

Ответы [ 6 ]

3 голосов
/ 28 марта 2011

Не

if(!strcmp(MacID, ClientMacs[x])) {    }

но

if(!strcmp(MacID, &ClientMacs[x])) { ... }

Аргумент 2 должен быть символом *, но у вас он есть как символ. Если бы ваш аргумент 2 был простым

  ClientMacs  // compiler understands that this is shorthand for &ClientMacs[0]

это было бы хорошо. Но когда индекс отличается от нуля, вы должны поставить с ним амперсанд.

- Пит

1 голос
/ 28 марта 2011

Не думаю, что вы понимаете, как работают строки (или указатели) в C.

Вы пытаетесь сравнить один символ вашего массива символов со строкой, передаваемой в:*

if(!strcmp(MacID, ClientMacs[x])
1 голос
/ 28 марта 2011
if(!strcmp(MacID, ClientMacs[x]))
                // ^^^^^^^^^^^ gives the character at index x

Возможно, вы имели в виду -

if(!strcmp(MacID, &ClientMacs[x]))
                //^  Added & symbol

С учетом утверждения printf, мне кажется, нет необходимости сравнивать символ за символом. Там нет необходимости петли. Это может быть -

 for(int x=0; x < 10; x++) {
    if(!strcmp(MacID, ClientMacs[x])) {
        printf(MacID," Successed!");
        return true;
    }
}

сгущено до -

if(!strcmp(MacID, ClientMacs)) {  // Changed ClientMacs[x] to ClientMacs
    printf(MacID," Successed!");
    return true;
}
1 голос
/ 28 марта 2011

ClientMacs должен быть массивом указателей на символы (строковые указатели), а не массивом символов. Вы также можете использовать определение типа LPCSTR, потому что вы также использовали его для параметра функции.

Попробуйте это:

BOOL Checking(LPCSTR MacID) {

    LPCSTR ClientMacs[18] = { "11:22:33:44:55:66", [put the other 9 (or is it 17?) MAC address strings here]};

    for(int x=0; x < 10; x++) {

         if(!strcmp(MacID, ClientMacs[x])) {
            printf(MacID," Successed!");
            return true;
         }
    }
}

Ваше наименование вообще ужасно, но я не изменил это.

1 голос
/ 28 марта 2011

есть и & отсутствует ... не указатель <-> указатель

BOOL Checking(LPCSTR MacID) {

    const char* ClientMacs[18] = { "11:22:33:44:55:66",};

     for(int x=0; x < 10; x++) {

         if(!strcmp(MacID, ClientMacs[x])) {

              printf(MacID," Successed!");

              return true;

         }

    }

    return false;

}

возможно

0 голосов
/ 28 марта 2011

Поскольку вы пометили этот C ++, я бы рекомендовал вообще не использовать strcmp и вместо него использовать std::string:

std::set<std::string> ClientMacs;

ClientMacs.insert("11:22:33:44:55:66");
 // presumably insert more MAC addresses here


bool check(std::string const &MacID) {    
    if (ClientMacs.find(MacID) != ClienMacs.end()) {
        std::cout << "Success!";
        return true;
    }
}

Однако следует добавить, что не совсем понятночто вы пытаетесь достичь здесь.Я предполагаю, что у вас есть список возможных MAC-адресов (например, всех компьютеров в вашей локальной сети), и вы пытаетесь проверить, соответствует ли полученный вами MAC-адрес (например, в пакете Ethernet) одному из следующих:те (например, для чего-то порядка брандмауэра, который будет гарантировать, что принимаются только пакеты из известных источников).

...