如何清除(char *)中的缓冲区?

时间:2014-09-18 22:29:39

标签: c++ visual-studio

在我的程序中,我有一个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; ......

2 个答案:

答案 0 :(得分:1)

当分配内存时,它不会首先归零(至少在使用malloc时,calloc - 但是,首先是零内存。)

要清除C(而不是C ++)中的缓冲区,您有几个选项:

  1. 使用calloc而不是malloc分配缓冲区。
  2. 使用Win32&#39; ZeroMemory功能
  3. 使用memset,如下所示:memset( buffer, 0x00, BUFFER_SIZE );
  4. 但是你明确地使用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。因此,当您第一次分配数组时,可能首先将所有值清零。