在我的程序中,我有一个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]=='\0')
{
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]
定义为二维数组。我之前做过这个测试。我现在明白这可能是我的问题的原因。如果我不知道可输入此变量的参数的确切数量,任何人都可以建议我替换它。用户可以每次发出不同的请求,如&#34; / help&#34;,&#34; / msg&#34;,&#34; / whois&#34;,&#34; / create&# 34; ......
答案 0 :(得分:1)
当分配内存时,它不会首先归零(至少在使用malloc
时,calloc
- 但是,首先是零内存。)
要清除C(而不是C ++)中的缓冲区,您有几个选项:
calloc
而不是malloc
分配缓冲区。ZeroMemory
功能memset
,如下所示:memset( buffer, 0x00, BUFFER_SIZE );
但是你明确地使用C ++,所以你应该使用标准库和C ++习语而不是C风格的东西,这意味着使用std::string
代替char*
,如果你有要直接使用缓冲区,那么C ++归零(或填充)数组或缓冲区的方式是std::fill
。
答案 1 :(得分:1)
首先,如果可以避免使用,我会避免使用双维数组。也许看看std :: string:
http://www.cplusplus.com/reference/string/string/
至于为什么char数组可能有&#34;随机垃圾&#34;在其中,当您在C ++中分配缓冲区时,它始终包含数据。如果要将数据设置为空,则必须手动将数据设置为0。因此,当您第一次分配数组时,可能首先将所有值清零。