2013-06-13 1 views
0

클라이언트에서 서버로 보낸 명령을 해석하는 프로그램을 만들려고합니다. 내 문제는 내가 명령의 첫 단어 만 읽을 수 있다는 것이다.scanf로 문구 읽기

dict.h

typedef struct 
{ 
    pid_t pid_cliente; 
    int status; 
    char command[TAM_MAX]; 
    char secure[TAM_MAX]; 
    char password[TAM_MAX]; 
    int client_type; 
} request; 

클라이언트 측

printf("[ADMIN]: "); 
    scanf("%s[^\n]", buffer); //reads command 
    printf("Sending -> '%s'\n", buffer); 
    strcpy(request.command, buffer, MAX_SIZE-1) //MAX_SIZE = 50 
    write(server_fifo, & request, sizeof(request)); 

서버 측

read_res = read(server_fifo, & request, sizeof(request)); 
if (read_res < sizeof(request)) 
     { 
      if (!strncasecmp("exit",(char *) & request,4)) return; 
      else 
      { 
       fprintf(stderr, "\nMessage Error!"); 
       return; 
      } 
     } 
token = strtok(request.command, " "); //reads command 
printf("Command -> '%s'\n", token) 

.. 
interprets wich command to do 
.. 

token = strtok(NULL, " "); //reads command argument 
printf("Argument -> '%s'\n", token); 

입력 :

addcity lisbon 

출력 : 아니다

Sending -> addcity 
Sending -> lisbon 

Command -> addcity 
Argument -> (NULL) 
+0

어떻게 보내고 실제 통화를주고, 클라이언트와 서버 사이의 명령을하시기 바랍니다받을 않습니다 .. – VoidPointer

+0

, 그 – xRed

+0

이 read''의 반환 값을 확인 미안하고 write' 호출합니다. 송수신 된 바이트 수를 의미합니다. 일치하지 않으면 필요한 모든 바이트를 수신 할 때까지 읽습니다. 수신 된 문자열에'NULL'을 덧붙여 그것을 확인하십시오 .. 더 명확하게하기 위해'요청'구조체 선언을 제공하십시오. – VoidPointer

답변

0

문제는 scanf 형식입니다. `완료

scanf(” %[^\n]s”, buffer); 
0

:

scanf("%s[^\n]", buffer); 

는 첫 번째 공간까지 하나 개의 전부입니다 %s을 읽는하지만

scanf("%[^\n]", buffer); 
+2

그리고'fgets()'는'scanf()'의 insetad에 사용해야하는 이유입니다. –

+0

예 : – Guillaume

0

귀하의 scanf 형식 사양이 귀하의 입력과 일치하지 않습니다. 는 scanf 형식 사양 0-9, A-Z를 읽을 것

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    char buf[64] = {0}; 
    printf("> "); 
    scanf("%[0-9a-z ]", buf); 
    printf(">> %s\n", buf); 
    return 0; 
} 

참고하고, 문자 공간 ("") 문자를 :이 간단한 프로토 타입은 당신이 원하는 광범위하게한다. 대문자로 된 단어와 다른 종류의 공백은 어리석은 짓입니다!

더 유연한 입력 처리를 위해 버퍼 ( )로 read (2)를 시도하고 고유의 토큰 화를 수행 할 수 있습니다. 플렉스/들소와 같은 것이 조사 가치가있는 입니다. 과잉이라고 할지라도. 응용 프로그램의 라이센스 제한 사항에 따라 GNU의 readline 라이브러리도 일 수 있습니다.

+0

감사합니다. 형식을 잃어 버렸습니다. 명령을 scanf하기 전에는 여전히 문제가 있습니다. 로그인해야합니다. 내가 로그인 한 후, 명령을 요구하기 위해 고안 될 때, 그것은 어떤 문자라도 입력하기 바로 전에 명령을 즉시 전송합니다. – xRed