2014-09-30 2 views
1

나는 C를 배우려고 노력 중입니다. 내가 sscanf를C sscanf 이해하는데 도움이 필요합니다.

sscanf(val1,":%[^ ] %s %s %[^\n]%*[\n\r]%n", val2 , val3 , val4 , val5 ,&n); 

에 대해 다음 코드를 찾고 있어요하지만 그것을 이해하는 문제가 많이 보내고있어, 난 sscanf를 대한 온라인을 검토 한 결과, 나는 val1과의 문자 배열을 이해하는 것과 다진됩니다 val2, val3, val4, val5 및 & n으로 증가합니다.

:%[^ ] %s %s %[^\n]%*[\n\r]%n 

내가 정말 사람이 할 수있는 희망 된 % s의 부품하지만 너무 확실하지 않다 나머지에 따라 처단됩니다 문자열을 믿고있어 :하지만 확실히이 비트를 이해하지 못하는 예제 문자열을 말할 수있게 해주고 어떻게 다른 값으로 변환 할 수 있을까요? 감사합니다. 0 개 이상의 공백 문자의 시퀀스가 ​​소비 될 필요가 있음을 나타내고, 존재하지

:%[^ ] %s %s %[^\n]%*[\n\r]%n 
^^^^ ^^^^
| | | |  | | | | 
| | | |  | | | +-- the number of characters read so far 
| | | |  | | +------ \n or \r 
| | | |  | +---------- read and ignore this portion of the input 
| | | |  +-------------- Read string up to \n; should be [^\n\r] 
| | | +-------------------- Read a string 
| | +---------------------- Read a string 
| +--------------------------- Read a string up to a space character 
+------------------------------ Read a ':' character 

단일 공백 ​​출력 변수 중 하나에 배치되는 다음과 같이

+3

RTFM. 'scanf '문서는'['지정자가 무엇을하는지 설명합니다. –

+2

http://man7.org/linux/man-pages/man3/scanf.3.html 그 man 페이지보다 훨씬 더 명백 할 수는 없습니다. – Deduplicator

답변

5

형식 문자열을 파싱 . 예를 들어 "%s %s""hello world" 문자열에 적용되면 "hello"은 첫 번째 문자열에, "world"은 두 번째 문자열에 삽입되고 두 문자열을 구분하는 공백은 무시됩니다.

%n 형식이 있으므로이 작업으로 입력에서 얼마나 많은 문자가 소비되었는지 알 수 있습니다. 이것은 일반적으로 루프의 다음 읽기 위치를 조정하고 루프가 계속 진행되거나 종료되어야하는지 여부를 결정하기 위해 수행됩니다.

참고 : 충분히 긴 문자 시퀀스를 입력하면 버퍼 오버런이 발생하기 때문에 %s을 사용하면 안전하지 않습니다. 문자열을 길이가 N 인 버퍼로 읽을 때 N-1 크기를 %s 사이에 넣어야합니다. 당신이 사이즈 32의 버퍼에 문자열을 읽으면 예를 들어, 다음과 같이, 당신의 형식 문자열을 변경

:%31[^ ] %31s %31s %31[^\n]%*[\n\r]%n 

이는 사용자가 31 개 이상의 문자를 입력 할 때 어떤 버퍼 오버런이 없음을 보장합니다. 문자 32는 널 종결 자용으로 예약되어야합니다.

+1

"공백 문자가 해당 지점의 문자열에 나타나야합니다." ** 공백 문자의 ** 무제한 ** 옵션이 매치 될 것입니다. – Deduplicator

+0

패턴의 공백은 빈 시퀀스에도 일치 할 수 있습니다. – Deduplicator

+0

나는이 "공간 문자까지의 문자열"에 대해 조금 혼란 스럽다. 이것은 다음 공간까지의 모든 문자열 값을 취한다는 것을 의미 하는가? 답변 해 주시고, 도움이되고, 쉽게 이해할 수있는 슈퍼 주셔서 감사합니다. –

관련 문제