У меня следующая проблема. я использовал 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";
,
Пожалуйста, помогите кому-нибудь. Я уже перепробовал все, что имел в виду, чтобы решить эту проблему.
Заранее спасибо!
Из контекста:
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);
Просто объявите указатели как 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);