Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ memcmp比较两个包含字符串的空指针_C++_String_Pointers_Void_Memcmp - Fatal编程技术网

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