user3251225
user3251225

Reputation: 147

How to clear the buffer in a (char*)?

In my program I have a char* buffer which is being used inside a thread sequence which carries text from one function into another, but the text is different through the run-time in my program. The question that I am asking is, which function can I use to clear the previously used text out of the char* ?

For example, I have the following code:

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 is defined as such: char GameUtils::line[2][32];

When the messagebox is output on the screen (while code is executed). I get some random junk characters in the text field. Can anyone tell me why this is?

Also! Note that line is assigned as stated in my previous question.

The function which assigns line is:

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++;
    }
}

The above function simply takes a parameter szLine[512] which is passed from my game interface and splits up the line assorting each space as a new parameter.

As an example, if inside the game the user states the line:

/msg <player> <message>

The function would assign each separate word to the line variable, respectively.

Such that, after the function is finished. line would look like

line[0] = /msg
line[1] = <player>
line[2] = <message>

So my question overall is as follows. Am I taking the cleaniest/most appropriate approach at this problem? If not, can anyone show me a better way to approach this problem? Also, can anyone explain to me why I am getting junk characters in the text parameter when the messagebox executes?

EDIT

After viewing the preview of my submitted question; I noticed I have defined char GameUtils::line[2][32] as a 2-dimensional array. I had done this earlier to test. I now understand this could have been the cause to my problem. Can anyone suggest me a replacement for this if I don't know the exact amount of parameters that could be inputted into this variable. The user can issue different requests each time like "/help ", "/msg ", "/whois ", "/create "...

Upvotes: 1

Views: 3948

Answers (2)

John Moses
John Moses

Reputation: 21

First off, I would avoid using double dimensional arrays if you can avoid it. Maybe look into std::string:

http://www.cplusplus.com/reference/string/string/

As for why a char array might have "random junk" in it, when you allocate a buffer in C++, it always has data in it. You have to manually set the data to 0 if you want it to be empty. So when you first allocate an array, it might be a idea to zero out all the values first.

Upvotes: 1

Dai
Dai

Reputation: 155698

When memory is allocated it isn't zeroed first (at least when using malloc, calloc - however, does zero memory first).

To clear a buffer in C (rather than C++), you have a few options:

  1. Allocate the buffer using calloc instead of malloc.
  2. Use Win32's ZeroMemory function
  3. Use memset, like so: memset( buffer, 0x00, BUFFER_SIZE );

However you're clearly using C++, so you should use the standard library and C++ idioms rather than C-style things, that means using std::string instead of char*, and if you have to use buffers directly then the C++ way of zeroing (or filling) an array or buffer is std::fill.

Upvotes: 1

Related Questions