我有下一个问题。我用了int memcmp ( const void * ptr1, const void * ptr2, size_t num );
函数来比较两个包含整数的void指针。这对我很有用。
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";
。
请帮助别人。我已经尝试过我心中想要解决这个问题的一切。
提前谢谢!
答案 0 :(得分:5)
来自cppreference:
int memcmp( const void* lhs, const void* rhs, std::size_t count );
将lhs和rhs指向的对象重新解释为unsigned char数组,并比较这些数组的第一个计数字符。比较是按字典顺序进行的。
在您的情况下,您要比较两个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);
答案 1 :(得分:4)
只需将指针声明为char*
或char[]
(在本例中基本相同),然后将它们进行比较。这很好用:
char firstValue[] = "abc";
char secondValue[] = "a";
int testSize = string(firstValue).size();
int compare = memcmp(firstValue, secondValue, testSize);
C++ reference页也有一个有效的例子。
如果您真的需要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);