-5

我有下一个问题。我使用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;

所以comparevalue 总是等于-1。即使我正在制作firstValue = "a"; secondValue = "a";. 请帮助某人。我已经尝试了我想到的一切来解决这个问题。先感谢您!

4

2 回答 2

5

来自 cppreference:

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

将 lhs 和 rhs 指向的对象重新解释为 unsigned char 数组,并比较这些数组的第一个 count 字符。比较是按字典顺序进行的。

在您的情况下,您正在比较两个std::string对象,其字节序列与保存实际字符串的缓冲区不同。您收到此错误是因为这些对象不是裸char数组而是实际

这是来自实际页面的注释(强调我的):

此函数读取对象表示,而不是对象值,并且通常仅对可简单复制的对象有意义。例如,memcmp()两个对象之间的类型std::stringstd::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);
于 2013-11-08T22:15:32.853 回答
4

只需将指针声明为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);
于 2013-11-08T22:22:24.197 回答