C++ 如何初始化动态分配的字符数组,以避免';你不明白那些奇怪的角色吗?

C++ 如何初始化动态分配的字符数组,以避免';你不明白那些奇怪的角色吗?,c++,C++,我想在我的“刽子手”游戏中使用这个角色数组来查看用户当前的进度 #include <iostream> #include "randword.h" #include <fstream> #include <time.h> #include <cstdlib> using namespace std; int main() { InitDictionary(); string tixaio=Randomword(); int m = tixa

我想在我的“刽子手”游戏中使用这个角色数组来查看用户当前的进度

#include <iostream>
#include "randword.h"
#include <fstream>
#include <time.h>
#include <cstdlib>

using namespace std;



int main()
{
InitDictionary();
string tixaio=Randomword();
int m = tixaio.length();
int guesses=8;
char *charptr= new char[m];





for(int aa=0;aa<m;aa++){
charptr[aa]='-';

}

cout << "The word now looks like this: "<<charptr;


}
#包括
#包括“randword.h”
#包括
#包括
#包括
使用名称空间std;
int main()
{
InitDictionary();
字符串tixaio=Randomword();
int m=tixaio.length();
整数猜测=8;
char*charptr=新字符[m];

对于(int aa=0;aa<p>),它是char *,你需要在0结束时有一个\\ 0终结符,这样打印就知道何时停止。C++中的

字符串必须以“\\”字符结尾:字符为值0。 但是,您应该使用
std::string
而不是字符数组。这样您就不必担心以空字符结尾。

将数组清除为0

memset(数组,0,大小);


或者在创建字符串后,在字符串结尾后添加一个
'\0'
,这将指示字符串的结尾。这将防止打印路由超出所需的限制。在这种情况下,您应该放置
字符[aa]='\0'
就在
for
循环之后。确保分配的内存块足够
charptr
您需要分配字符串+1的长度(对于
'\0'
字符)。

您应该在填充数组后添加一个
\0
作为最后一个元素


更好的选择是使用<代码> STD:String ,这是C++的方式,它可以更好地以优雅的方式完成操作,而不必像No.Cch**/COD>< /P>> P>在C++、CUT(或任何OFFASH对象)中打印字符数组那样,不必考虑零终止。查找空终止字符以确定何时停止打印。现在,如果您只为数组分配了

m
字节,并且无法尝试访问这些
m
字节之外的内存,则甚至可能会出现分段错误

避免这种情况的一种方法是为超出需要的字符分配空间,并将“\0”分配给该额外字符

char *charptr= new char[m+1];
charptr[m] = '\0';

因为使用C++,它有一个内置的STD::String类,您可以使用它。它自动将空终止字符附加到字符串中。这个行为可以通过在STD::string对象(调用STD::String to char *)上调用<代码> CyString()/Cux>函数来验证。。它将始终返回

n+1
个字符,其中n是std::string的
length()返回的数字函数。正如你所猜的,最后一个字符将是0。< /P> < P>你必须插入“\\ 0”字符,因为它是一个空结束的字符串

如何终止null结尾字符?如何避免字符**,使用<代码> STD::String ?C++中的M—S字符串是用<代码> STD::字符串词(m,'-)创建的。;
。与您的方法相比:)
aa
的作用域以
for
循环的终止而结束,因此该循环不会编译。@Nicol Bolas:是的!很快就注意到:)几乎和我一样