2014-11-09 9 views
0

영어가 모국어가 아니기 때문에 무엇을 부르는 지 정확히 모르겠습니다. 제가 개발중인 것은 숙제를 위해 winsock2.h를 사용하는 간단한 채터 프로그램입니다.입력 명령 만들기 (이름을 지정해야할지 모르겠 음)

내가 붙어있는 것은 명령을 내리는 것입니다. 예를 들어, 사용자가 cin 스트림에 '/ u username'을 입력하면 사용자의 사용자 이름을 설정 한대로 변경할 수 있기를 원합니다.

현재 사용자 유형을 서버에 보내고 서버가 C 문자열을 어떻게 처리할지 결정하도록합니다.

이 경우 내 서버에 '/ u username/0'이 수신됩니다. '/ u/0'을 C 문자열에서 분리하고 어떻게 감지합니까?

void ServerGame::ProcessTalkLine(char * inStream, unsigned int size, unsigned int id_client) 
{ 
if (size >= 2) //Any commands would need /'character', which is two character or more 
{ 
    //I have no idea how to do it.... 
} 

else 
    sendTalkPackets(inStream, size, id_client); 
} 
+0

입력을 토큰 화하려는 것처럼 들립니다. – shuttle87

+0

@ shuttle87 strtok가 c 문자열을 토큰 화한다는 내용을 읽었지만 실제로 의미하는 바가 전혀 없습니다. – user2418426

+0

토큰 화 도구는 문자열을 가져 와서 별도의 부분으로 분리하여 토큰을 호출합니다. 그래서 여러분은 명령과 인자를 가진 문자열을 구분 기호 (이 경우에는 공백)로 구분합니다. 따라서'/ u username'을 사용하면 이것을 토큰'/ u'과'username'으로 분리하고 싶을 것입니다. 입력을 처리하는 것이 훨씬 쉽습니다. 명령 유형의 첫 번째 토큰을 확인한 후 다음 토큰에서 원하는 것을 추출하면됩니다. – shuttle87

답변

0

다음과 같은 아이디어가 너무 좋지 않을 수도 있지만 몇 가지 복잡한 방법이 있습니다. 처음 시작하면 효과가 있습니다.

void ServerGame::ProcessTalkLine(char * inStream, unsigned int size, unsigned int id_client) 
{ 
    if ((inStream == NULL) || (size == 0)) 
    { 
     return; 
    } 

    if (inStream[0] == '/') // inStream may contain a command 
    { 
     if ((size > 3) && (inStream[1] == 'u') && (inStream[2] == ' ')) // inStream contains /u command? 
     { 
      /* process change of user name */ 
      printf("changing user name to %s\n", &(inStream[3])); 
      return; // stop here since message is processed! 
     } 

     /* 
     ** strtok blueprint: 
     pCommand = strtok(&(instream[1]), " "); // input string is everything behind the '/' 

     if (!strcmp(pCommand, "u")) // /u username 
     { 
      username = strtok(NULL, "\0"); // get rest behind pCommand 

      // process command 

      return; 
     } 

     if (!strcmp(pCommand, "test")) // /test arg1 arg2 
     { 
      arg1 = strtok(NULL, " "); // get next token 
      arg2 = strtok(NULL, "\0"); // get the rest... 

      // process command 

      return; 
     }   
     */ 
    } 

    sendTalkPackets(inStream, size, id_client); 
} 

당신이 더 당신이 strtok에 모습을 가질 수있다 복잡 명령을 많이 가지고있는 경우.

또한 모든 문자열 함수는 문자열을 종료하기 때문에 '\ 0'문자를 자동으로 "제거"(처리 중지)합니다. 따라서 각 문자열의 끝에 '\ 0'문자가 있는지 확인해야합니다. 그렇지 않으면 문자열 함수를 호출하면 '\ 0'을 찾을 때까지 전체 메모리를 처리합니다 ...

+0

글쎄, 나는 몇 가지 명령을 가지고 앞으로 이것을 확장하고자한다. strtok을 사용한다면 어떨까요? 당신이 나를 가리킬 수있는 예가 있습니까? 페이지 안의 예제는 정말 혼란 스럽습니다. 또는 예제를 통해 나를 안내하십시오. – user2418426

+0

@ user2418426 strtok 청사진으로 내 answert를 업데이트했습니다. 모든 추가 변수는'char *'유형이어야합니다. 내 청사진에서 토큰은 공간에 의해 분리됩니다. 따라서 토큰에는 공백이 포함될 수 없습니다. –

관련 문제