memcmp сравнивает два пустых указателя, которые содержат строки

У меня следующая проблема. я использовал int memcmp ( const void * ptr1, const void * ptr2, size_t num );
функция для сравнения двух пустых указателей, которые содержат целые числа. Это сработало для меня очень хорошо.

int firstValue = 5;
int secondValue = 3;
void* firstValueVoid;
void* secondValueVoid
firstValueVoid = new int(firstValue);
secondValueVoid = new int(secondValue);
int compare = memcmp(firstValueVoid, secondValueVoid, 4);
cout << compare << endl;

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

string firstValue = "abc";
string secondValue = "a";
int testSize = firstValue.length();
void* firstValueVoid;
void* secondValueVoid
firstValueVoid = new string(firstValue);
secondValueVoid = new string(secondValue);
int compare = memcmp(firstValueVoid, secondValueVoid, testSize);
cout << compare << endl;

Так compare значение всегда становится равным -1, Даже если я делаю firstValue = "a"; secondValue = "a";,
Пожалуйста, помогите кому-нибудь. Я уже перепробовал все, что имел в виду, чтобы решить эту проблему.
Заранее спасибо!

-5

Решение

Из контекста:

int memcmp( const void* lhs, const void* rhs, std::size_t count );

Переинтерпретирует объекты, на которые указывают lhs и rhs, как массивы беззнаковых символов и сравнивает первые числа символов этих массивов. Сравнение сделано лексикографически.

В вашем случае вы сравниваете два std::string объекты, чьи последовательности байтов отличаются от буфера, который содержит фактическую строку. Вы получаете эту ошибку, потому что эти объекты не голые char массивы но довольно актуально классы.

Вот примечание от фактической страницы (выделение мое):

Эта функция читает представления объекта, а не значения объекта, и обычно имеет смысл только для легко копируемых объектов. Например, memcmp() между двумя объектами типа std::string или же std::vector не буду сравнивать их содержание.

Вы должны использовать массив char за это:

char abc[] = "abc";
char abd[] = "abd";

int bytes = std::min(sizeof abc, sizeof abd);

int c1 = memcmp(abc, abd, bytes);
int c2 = memcmp(abd, abc, bytes);

Если вам действительно нужно void*s:

void* a = abc;
void* b = abd;

int c1 = memcmp(reinterpret_cast<char*>(a),
reinterpret_cast<char*>(b), bytes);

int c2 = memcmp(reinterpret_cast<char*>(b),
reinterpret_cast<char*>(a), bytes);
5

Другие решения

Просто объявите указатели как char* или же char[] (что по сути то же самое в этом случае), и сравнить их так. Это отлично работает:

char firstValue[] = "abc";
char secondValue[] = "a";
int testSize = string(firstValue).size();

int compare = memcmp(firstValue, secondValue, testSize);

Есть рабочий пример на C ++ ссылка страница тоже.

Если вам ДЕЙСТВИТЕЛЬНО нужны указатели void, используйте их следующим образом:

int someData1 = 35243242;
int someData2 = 34243251;

void *ptr1, *ptr2;

ptr1 = &someData1;
ptr2 = &someData2;

int testSize = sizeof(int);

int compare = memcmp((char*)ptr1, (char*)ptr2, testSize);
cout << compare << endl;

или со строками:

string someData1 = "sdadsasd";
string someData2 = "sdadsasd";

void *ptr1, *ptr2;
const char *c1, *c2;

c1 = someData1.c_str();
c2 = someData2.c_str();

ptr1 = (char*)c1;
ptr2 = (char*)c2;

int testSize = someData1.size();

int compare = memcmp(ptr1, ptr1, testSize);
4

По вопросам рекламы [email protected]