如何清除(char*)中的缓冲区
How to clear the buffer in a (char*)?
在我的程序中,我有一个char* buffer
,它在线程序列中使用,该线程序列将文本从一个函数传递到另一个函数,但在程序的运行时,文本是不同的。我要问的问题是,我可以使用哪个函数从char*
中清除以前使用的文本?
例如,我有以下代码:
int GameUtils::GetText(char *text)
{
for(int i=0; i<LINES_OF_TEXT; i++)
{
if(line[i][0]!=0)
{
strcpy(text, line[i]);
MessageBox(0, text, 0, 0);
line[i][0]=0;
return 1;
}
}
return 0;
}
line
定义如下:char GameUtils::line[2][32];
当屏幕上输出消息框时(执行代码时)。我在文本字段中得到一些随机的垃圾字符。有人能告诉我为什么会这样吗?
还有!请注意,这一行是按照我之前的问题中所述分配的。
分配line
的函数是:
for (int x=0; x<((int)(strlen(szLine)+1)); x++)
{
if (szLine[x]==' ' || szLine[x]==' ')
{
m=x;
for (y=0, z=n; z<m; y++, z++)
{
line[w][y]=szLine[z];
}
n=x+1;
w++;
}
}
上面的函数只是取一个从我的游戏界面传来的参数szLine[512]
,并将每个空间的行划分为一个新的参数。
举个例子,如果在游戏中,用户声明以下行:
/msg <player> <message>
该函数会将每个单独的单词分别分配给line
变量。
这样,在功能完成之后。line
看起来像
line[0] = /msg
line[1] = <player>
line[2] = <message>
因此,我的问题总体如下。对于这个问题,我是否采取了最干净/最合适的方法?如果没有,有人能告诉我解决这个问题的更好方法吗?另外,有人能向我解释一下为什么在执行消息框时,text
参数中会出现垃圾字符吗?
编辑
在查看了我提交的问题的预览后;我注意到我已经将char GameUtils::line[2][32]
定义为一个2维数组。我早些时候这样做是为了测试。我现在明白了这可能是我问题的原因。如果我不知道可以输入到这个变量中的确切参数数量,有人能建议我替换它吗。用户每次都可以发出不同的请求,如"/help"、"/msg"、"/wois"、"/create"。。。
分配内存时,不会先将其归零(至少在使用malloc
、calloc
时,会先将内存归零)。
要清除C(而不是C++)中的缓冲区,您有几个选项:
- 使用
calloc
而不是malloc
来分配缓冲区 - 使用Win32的
ZeroMemory
函数 - 使用
memset
,如下所示:memset( buffer, 0x00, BUFFER_SIZE );
然而,您显然使用的是C++,因此您应该使用标准库和C++习惯用法,而不是C风格的东西,这意味着使用std::string
而不是char*
,如果您必须直接使用缓冲区,则对数组或缓冲区进行归零(或填充)的C++方式是std::fill
。
首先,如果可以避免的话,我会避免使用二维数组。也许可以研究std::string:
http://www.cplusplus.com/reference/string/string/
至于为什么一个char数组中可能有"随机垃圾",当你在C++中分配缓冲区时,它总是有数据。如果你想让它为空,你必须手动将数据设置为0。因此,当您第一次分配数组时,最好先将所有值清零。
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- char* 缓冲区 = C++ 中的新 vs char 缓冲区 []
- char p[0]表示自动分配的缓冲区还是安全指针
- 通过 char* 缓冲区读取 int 的行为是不同的,无论是正数还是负数
- 将 char* 推送到矢量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到矢量中
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- 当需要将char缓冲区转换为字符串时
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 将int转换为十六进制并将其存储到char缓冲区中
- 从 char* 缓冲区读取int32_t的惯用 cpp14 方法是什么?
- 如何在C#struct中声明和使用固定尺寸的char缓冲区
- 从 char 缓冲区读取 32 位变量
- RapidXML-解析char *上的缓冲区溢出
- 通过HTTP获得C ,忽略Char缓冲区中的逃生字符
- 生成*char缓冲区
- fopen在响应不相关的char缓冲区时崩溃
- 将以null结尾的char数组复制到符合缓冲区长度的std::字符串中
- 使用 libzpaq 压缩 c++ 压缩到 char* 缓冲区
- 在一系列char*缓冲区中查找序列号
- 无法将整数写入缓冲区(char*)内的偏移量