我是一名c ++新手,只是尝试编写一些代码来自己进行实验。
最近我遇到了一个无法调试的问题。
char acExpReason[128];
char acReason[] = "An error message is information displayed when an unexpected condition occurs, usually on a computer or other device. On modern operating systems.";
memcpy(acExpReason, acReason, sizeof(acExpReason));
std::string strExpReason(acExpReason);
我使用VS2005为每一行添加断点进行调试。
当它到达第二行的断点时,Autos中的变量名称和值信息为:
acReason 0x00f6f78c “ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ” 的char [147]
acExpReason 0x00f6f828 “ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̺” 的char [128]
当它到达第三行的断点时,Autos中的变量名称和值信息为:
acExpReason 0x00f6f828 “ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̺” 的char [128]
acReason 0x00f6f78c“错误消息是指出现意外情况时显示的信息,通常是在计算机或其他设备上。在现代操作系统上。” char [147]
当它到达第四行的断点时,Autos中的变量名称和值信息为:
acExpReason 0x00f6f828“错误信息是指在发生意外情况时显示的信息,通常是在计算机或其他设备上显示的信息。在现代的情况下,”char [128]
acReason 0x00f6f78c“错误消息是指出现意外情况时显示的信息,通常是在计算机或其他设备上。在现代操作系统上。” char [147]
strExpReason Bad Ptr
执行最后一行后,Autos中的信息为:
acExpReason 0x00f6f828“错误信息是指在发生意外情况时显示的信息,通常是在计算机或其他设备上显示的信息。在现代的情况下,”char [128]
acReason 0x00f6f78c“错误消息是指出现意外情况时显示的信息,通常是在计算机或其他设备上。在现代操作系统上。” char [147]
strExpReason“错误信息是指发生意外情况时显示的信息,通常是在计算机或其他设备上显示。现代版”
基本上我的代码想做的只是拥有一个完整的msg存储在acReason []中,并且还有一个固定长度的完整msg的副本(这里是128)。
但我不知道为什么acExpReason和strExpReason(acExpReason的字符串版本)将以一些我不想要的奇怪字符“ÌÌÌÌ”结束(因为我将使用此字符串与其他字符串进行比较)
我尝试使用memcpy,strcpy和strncpy,它们最终都在字符串的末尾有一组奇怪的字符。
有人可以帮忙吗? 非常感谢提前。
答案 0 :(得分:4)
std::string strExpReason(acExpReason);
此构造函数需要C样式的字符串。但是acExpReason
不是C风格的字符串,因为它没有终止零字节。 (构造函数如何知道字符串中应该有多少字节?)您必须遵守规则。
答案 1 :(得分:3)
在C中所有字符串函数(如strcpy)以及c ++ std::string
的构造函数都将char*
作为参数,但char*
必须以包含`\ 0`的字节终止。 / p>
acExpReason没有结束它所以所有字符串函数都在内存中查找下一个0字节。 acReason确实有一个尾随的`\ 0`。正常strcpy会起作用,因为它也会复制0,但是@VladLazarenko说缓冲区大小太小会导致所有内存被覆盖。
要使memcpy工作,您需要复制比缓冲区少一个字节,并使缓冲区的最后一个字节为0。 e.g。
memcpy(acExpReason, acReason, sizeof(acExpReason)-1);
acReason[sizeof(acExpReason)-1] = 0;
答案 2 :(得分:2)
您也可以使用接受迭代器范围的string
构造函数 -
std::string strExpReason(acExpReason, acExpReason+sizeof(acExpReason));