ошибка C2664: «strcmp»: невозможно преобразовать параметр 2 из «char» в «const char *»

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

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' в 'const char *' Преобразование из целочисленного типа в тип указателя требует реинтерпретации_приведения, приведения в стиле C или приведения в стиле функции

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


person Valter    schedule 27.03.2011    source источник


Ответы (6)


Нет

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

но

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

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

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

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

-- Пит

person Pete Wilson    schedule 27.03.2011
comment
Почему-то я не думаю, что его реальным намерением было сравнить один символ своего массива с передаваемой строкой. - person Brian Roach; 28.03.2011
comment
@ Брайан - почему-то я не думаю, что ты ошибаешься. Функция strcmp() не сравнивает ни одного символа по определению. Как вы думаете, почему? Я думаю, он хочет НАЧАТЬ сравнение нескольких символов с ClientMacs[x] и продолжать сравнение нескольких символов до тех пор, пока функция strcmp() не найдет NUL в той или иной строке. Это то, что делает функция strcmp(). Кто сказал что-нибудь о односимвольных сравнениях? - person Pete Wilson; 28.03.2011
comment
@Pete - Он сделал это, пытаясь передать ClientMacs[x] (один символ) в strcmp (что, конечно, принимает char*). Ваши изменения заставят его работать, но только полностью аннулируя его цикл. Первая итерация, в которой вы передаете ему &ClientMacs[0], будет либо успешной, либо неудачной — это то же самое, что и передача ClientMacs — это указатель на первый байт массива. Его логика имеет смысл только в том случае, если он думал, что у него есть многомерный массив. - person Brian Roach; 28.03.2011
comment
Висячий , в его первоначальном задании добавляет еще больше правдоподобия этой теории. - person Brian Roach; 28.03.2011
comment
Извините - я неправильно выразился - я пытаюсь подчеркнуть, что в том, что вы описываете, мало логики. Зачем ему пытаться выяснить, совпала ли строка, начинающаяся где-то в первых 10 байтах? - person Brian Roach; 28.03.2011
comment
Чтобы найти подстроку, начинающуюся с некоторого смещения символа от theCandidateString[0], он начал бы сопоставление с первого символа этой подстроки, не так ли? Например, если вы заинтересованы в сопоставлении только имени домена с URL-адресом, вы можете вызвать функцию strrchr(), чтобы найти положение последней косой черты в URL-адресе; затем вызовите функцию strncmp() для символов, следующих за последней косой чертой. Я все время это делаю; но я всегда стремлюсь учиться, и я буду рад услышать от вас, как усилить логику этой стратегии. - person Pete Wilson; 05.04.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;

}

возможно

person Ronny Brendel    schedule 27.03.2011
comment
не знаю, значит крашится винда просит отладку - person Valter; 28.03.2011
comment
Ошибка в том, что когда x > 0, этот код передает нулевой указатель на strcmp(). - person Jason Orendorff; 08.08.2014

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

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

if(!strcmp(MacID, ClientMacs[x])
person Brian Roach    schedule 27.03.2011
comment
strcmp() здесь не работает. Для сравнения с одним символом сделайте следующее: - person Pete Wilson; 28.03.2011
comment
if ( MacID[x] == ClientMacs[x] ) { ... } или аналогичный. - person Pete Wilson; 28.03.2011
comment
Это была моя точка зрения, Пит. У Уилла Дина есть правильный ответ. К сожалению, бедный парень, вероятно, никогда этого не увидит (хотя он может вернуться, когда попытается присвоить { "<mac address>", "<mac address>" } своему массиву символов). - person Brian Roach; 28.03.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;
}
person Mahesh    schedule 27.03.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;
         }
    }
}

Ваше имя в целом довольно ужасное, но я его не изменил.

person Will Dean    schedule 27.03.2011
comment
@Will - Боюсь, то, что вы говорите, не совсем верно. OP не нужен массив указателей, а указатель где-то внутри массива символов ClientMacs[]. - person Pete Wilson; 28.03.2011
comment
@ Пит - я не думаю, что он знает. Я думаю, что это то, к чему он пришел, пытаясь сделать то, что Уилл описывает выше (обратите внимание на оборванный , в его назначении массива символов, и нет смысла сравнивать первые 10 символов) - person Brian Roach; 28.03.2011
comment
dodwords: mov eax,[edx] cmp al,[ecx] jne short donene или al,al jz short doneeq cmp ah,[ecx + 1] jne short donene or ah,ah jz short doneeq shr eax,16 -››› происходит сбой на cmp al, [ecx] в файле strcmp.asm с использованием отладки 2005 года. - person Valter; 28.03.2011
comment
Я добавил аннотацию о том, где находятся отсутствующие адреса - я на 95% уверен, что он пытается увидеть, соответствует ли указанный адрес какому-либо из списка возможных. - person Will Dean; 28.03.2011
comment
Этот вопрос так полон неудач (не ваш ответ - это в основном о деньгах). Обратите внимание, что !strcmp() приведет к вызову и возврату printf(), когда строки не совпадают. Конечно, вы никогда не увидите Successed, так как printf() тоже неверно; он напечатает только MacID. - person Brian Roach; 28.03.2011

Поскольку вы пометили этот С++, я бы посоветовал вообще не использовать 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) соответствует одному из те (например, для чего-то вроде брандмауэра, который гарантирует, что пакеты принимаются только из известных источников).

person Jerry Coffin    schedule 27.03.2011