C++ memcmp比较两个包含字符串的空指针
我还有一个问题。我使用了C++ memcmp比较两个包含字符串的空指针,c++,string,pointers,void,memcmp,C++,String,Pointers,Void,Memcmp,我还有一个问题。我使用了int memcmp(const void*ptr1,const void*ptr2,size\u t num) 函数比较两个包含整数的空指针。这对我很有效 int firstValue = 5; int secondValue = 3; void* firstValueVoid; void* secondValueVoid firstValueVoid = new int(firstValue); secondValueVoid = new int(secondValu
int memcmp(const void*ptr1,const void*ptr2,size\u 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;
int firstValue=5;
int第二值=3;
无效*第一个值无效;
void*secondValueVoid
firstValueVoid=新整数(firstValue);
secondValueVoid=新整数(secondValue);
int compare=memcmp(firstValueVoid,secondValueVoid,4);
cout来自CPP参考:
将lhs和rhs指向的对象重新解释为无符号字符数组,并比较这些数组的第一个计数字符。比较是按字典顺序进行的
在本例中,您正在比较两个std::string
对象,它们的字节序列与保存实际字符串的缓冲区不同。出现此错误是因为这些对象不是裸char
数组,而是实际的类
以下是实际页面的注释(我的重点):
此函数读取对象表示,而不是对象值,通常仅对可复制的普通对象有意义。例如,类型为std::string
或std::vector
的两个对象之间的memcmp()
将不会比较它们的内容。
您应该为此使用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);
void*a=abc;
void*b=abd;
int c1=memcmp(重新解释铸件(a),
重新解释(b),字节);
int c2=memcmp(重新解释铸件(b),
重新解释(a),字节);
只需将指针声明为char*
或char[]
(在本例中基本相同),然后像这样比较它们。这很好:
char firstValue[] = "abc";
char secondValue[] = "a";
int testSize = string(firstValue).size();
int compare = memcmp(firstValue, secondValue, testSize);
页面上也有一个工作示例
如果您真的需要空指针,请像这样使用它们:
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;
为什么?为什么要新增
?为什么void*
?您需要了解类型是什么、指针是什么、类是什么、新的是什么、需要它的地方以及如何使用它。基本上你必须阅读初学者指南。为什么你要用memcmp()
来比较整数,而不是直接比较它们?为什么要使用memcmp()
来比较字符串,而不是使用strcmp()
函数族或std::string::compare()
方法memcmp()
仅用于比较原始数据。@user2962977如果您已经知道答案,为什么要问?让我告诉你,你还没有足够的知识来拒绝帮助。你确实需要帮助,我们可以给你。但前提是你真的想要。您确实需要知道void*
的背后是什么。如果你知道那里有什么,投下它,做一个适当的比较。如果你不知道那里有什么,游戏就结束了。不要过关。不要收取200英镑。@user2962977请降低语气…谢谢你的建议,但实际上,我已经尝试过使用字符数组来做同样的事情了:(你能提供一些例子吗?谢谢!@user2962977然后给他们分配void*
s(即void*a=abc;void*b=abd;
)然后将它们重新解释为char*
@user2962977是的,我已经看到了你的第一个例子。你用新的操作符来分配内存,制造内存韭葱,你在比较字符串,而不是字符指针。如果你现在还不能理解,现在就读答案。我对试图帮助你的人更礼貌一些。真的吗y、 非常好地工作,只有字符串的例子。其他有错误。谢谢!
char firstValue[] = "abc";
char secondValue[] = "a";
int testSize = string(firstValue).size();
int compare = memcmp(firstValue, secondValue, testSize);
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);