2014-09-18 1 views
1

내 프로그램에서 한 함수에서 다른 함수로 텍스트를 전달하는 스레드 시퀀스 내에서 사용되는 char* buffer이 있지만 텍스트가 프로그램의 런타임을 통해 다릅니다. 내가 묻는 질문은 어떤 기능을 사용하여 char*에서 이전에 사용한 텍스트를 지울 수 있습니까?(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는 예컨대 다음과 같이 정의된다 :

예를 들어, I는 다음과 같은 코드가 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]를 받아 새로운 매개 변수로 각각의 공간을 assorting 라인을 분할합니다. 일례로서

게임 내부 사용자가 선 상태 경우 :

/msg <player> <message>

함수는 각각 line 변수 각 개별 단어를 지정할 것이다.

기능 완료 후. line은 다음과 같을 것입니다

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

그럼 내 질문은 전체적으로 다음과 같습니다. 이 문제에 대해 가장 깨끗하고 가장 적절한 접근법을 취하고 있습니까? 그렇지 않다면 누구든지 나에게이 문제에 접근하는 더 좋은 방법을 보여줄 수 있습니까? 또한, 아무도 나에게 왜 text 매개 변수에서 메시지 상자가 실행될 때 정크 문자를 받고 있는지 설명 할 수 있습니까?

편집

내 제출 한 질문의 미리보기를 본 후, 나는 char GameUtils::line[2][32]을 2 차원 배열로 정의했다. 나는 이것을 시험하기 위해 일찍 끝냈다. 이제는 이것이 내 문제의 원인이 될 수 있음을 이해합니다. 누구든지이 변수에 입력 할 수있는 매개 변수의 정확한 양을 모르는 경우이를 대체 할 사람을 제안 할 수 있습니까? 사용자는 "/ help", "/ msg", "/ whois", "/ create"와 같이 매번 다른 요청을 실행할 수 있습니다 ...

+0

문자열/버퍼를 어떻게 할당합니까? – Dai

+0

line = malloc (sizeof (char) * 1024); – user3251225

+0

'char *'는 버퍼가 아닙니다. 버퍼에 대한 포인터입니다. –

답변

1

메모리가 할당되면 처음 사용할 때 malloc, calloc - 그러나 처음에는 메모리가 0입니다.

  1. 대신 malloccalloc를 사용하여 버퍼를 할당 :

    가 C (보다는 C++)에서 버퍼를 지우려면, 당신은 몇 가지 옵션이 있습니다.
  2. 사용 Win32에서의 ZeroMemory 기능
  3. 사용 memset, 그래서 같은 : 당신이 표준 라이브러리와 C++ 숙어보다는 C 스타일의 물건을 사용해야 있도록 명확하게, C++를 사용하고 그러나 memset(buffer, 0x00, BUFFER_SIZE);

, 그 수단 char* 대신 std::string을 사용하고 직접 버퍼를 사용해야하는 경우 배열 또는 버퍼를 0으로 채우거나 채우는 C++ 방식은 std::fill입니다.

+0

고맙습니다! 나는 memset()을 사용하여 의지했고 나의 문제는 이제 고쳐졌다. – user3251225

+0

버퍼를 채우고 종결자를 추가하는 대신 전체 버퍼를 채우기 전에 전체 버퍼를 0으로 만드는 안티 패턴이있을 가능성이 높습니다. –

+0

@DavidSchwartz 반드시 * 정말 * 나쁜 패턴 인 것은 아닙니다. – Dai

1

첫 번째로, 피할 수 있다면 먼저 2 차원 배열을 사용하지 마십시오. 어쩌면 표준 : : 문자열로 보면 :

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

를 사용하면 C++에서 버퍼를 할당 할 때 문자 배열은, 그것에서 "임의 쓰레기"가 이유에 관해서는, 항상 데이터를 가지고있다. 데이터를 비우려면 수동으로 데이터를 0으로 설정해야합니다. 따라서 배열을 처음 할당 할 때 모든 값을 먼저 제로로 만드는 것이 좋습니다.

관련 문제