2014-12-03 2 views
1

나는, 문자열에서 같은 것을 데이터를 제거하기 위해 노력하고있어 : 내가 아는sscanf에서 알려진 단어를 어떻게 무시합니까?

char * fromSocket = "GET /test.html HTTP 1.0\n""Host: www.example.com\n""Client: 127.0.0.1:60000\n"; 

, 즉이 경우 "HTTP 1.0" "호스트에서"와 "클라이언트"와 사이에 세미콜론 클라이언트 IP와 포트가 항상있을 것입니다. 나는이 같은 sscanf를()를 사용하려고 해요 :

sscanf(conString, "%s %s HTTP 1.0 Host: %s Client: %s:%s", com, loc, hos, cli, port); 

을하지만이를 사용하여 출력을 테스트 할 때 :

printf("%s %s %s %s %s\n", com, loc, hos, cli, port); 

나는 널 (NULL)의 무리를 얻을. 나는 존재하는 특정 단어를 어떻게 무시합니까? 나는 몇몇 페이지를 온라인에서 보았지만, 1.0은 스캐너를 던지거나 어떤 것을 던 졌다고 생각한다. 감사!

+2

당신은없는 것으로 나타'[\ R] \ n' 및 HTTP/1.0''에서 슬래시. HTTP 파서를 사용하십시오! – Ryan

+0

데이터가 fromSocket에있을 때 conString을 보는 이유는 무엇입니까? – user3629249

+0

을 테스트하려면 scanf 함수의 반환 값을 확인하여 성공적으로 수행 된 변환 수를 확인하십시오. 형식 문자열에서 처음 '% s'을 (를) 얻기 위해 시작하는 것이 좋습니다. 그런 다음 문제가 발견 될 때까지 거기에서 작업하십시오. – user3629249

답변

4

형식 문자열에이 부분을 넣으면 sscanf은 해당 부분을 표시하고 처리하지만 모든 변수로 읽지 않습니다. 예를 들어 :

sscanf("GET /test.html HTTP 1.0\nHost: www.example.com\nClient: %16[^:]:%d\n", cli, port); 

또한 scanf()에서 (스캔 세트 외부) 공백 다른 문자에서 약간 다르게 처리됩니다 - 대신 지정된 문자와 일치, 그것은 임의의 일치합니다 공백의 크기입니다 (예를 들어, 형식 문자열의 "\n"은 입력 데이터에서 " \t\v \r"과 일치 할 수 있음). 따라서 new-lines이 실제로 new-lines인지 (다른 white-space가 아닌지) 확인해야한다면 %*[\n]과 같은 것으로 바꿀 필요가 있습니다. 그렇게한다면, 대부분의 네트워크 프로토콜의 표준은 "\ r \ n"시퀀스라는 것을 명심하십시오.

실제 질문이 (예를 들어) www.example.com을 임의의 문자열로 허용하는 방법이고 거기에 문자열이 있지만 변수로 읽지 않으려면 다음을 사용할 수 있습니다. *와 변환 읽을 수 있지만 같은 변환을 방지하기 위해 : %*s :

sscanf("GET %*s HTTP 1.0\nHost: %*s\nClient: %16[^:]:%d\n", cli, port); 
+0

"GET", "/test.html", "www.example.com", 클라이언트 IP 및 클라이언트 포트를 다른 데이터 구조로 읽을 수는 있지만 새 줄 문자를 제거하더라도, 나는 여전히 그들의 가치를 실제로 읽는 데 문제가 있습니다. 편집 : 신경 쓰지 마세요, 당신 말이 맞았습니다. 제가 가지고 있던 또 다른 문제는 저의 결과물을 엉망으로 만들고 있다는 것입니다. 고마워요! – user3107774

+0

@chux : 괜찮아. 나는'scanf'를 거의 사용하지 않는다. 알림 주셔서 감사합니다; 그에 따라 편집했습니다. –

관련 문제