memcmp比较两个包含字符串的void指针

时间:2013-11-08 22:06:13

标签: c++ string pointers void memcmp

我有下一个问题。我用了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";。 请帮助别人。我已经尝试过我心中想要解决这个问题的一切。 提前谢谢!

2 个答案:

答案 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);