2012-11-29 3 views
1

여러 출력 파일의 파일 이름 형식을 나타내는 명령 행에서 형식 문자열을 사용하는 프로그램이 있습니다. 실제 출력 파일 이름을 생성하기 위해 대체 할 수있는 단일 정수 인수 만 사용해야하며 입력 검사를 할 때이를 확인하고 싶습니다. 형식 문자열이 C에서 기대하는 인수의 수를 결정하는 좋은 방법은 무엇입니까?C에서 형식 문자열에 대한 인수의 수를 계산하는 방법은 무엇입니까?

+0

'printf'의 완전한 보편성을 필요로하지 않는다면, 템플릿에 간단한 구조를 사용하면 쉽게 확인할 수 있습니다. – Barmar

+0

어떤 형식 문자열입니까? 'printf'는? 어떤 종류의 예제를 게시 할 수 있습니까? – netcoder

+0

죄송합니다. 예, printf 스타일 형식 문자열입니다. printf가 필요한 모든 것을 할 수있을 때 커스텀 포맷을 파싱하는 일을 번거롭게하고 싶지는 않습니다. –

답변

1

허용되는 인수의 수는 C 라이브러리의 버전에 따라 다릅니다 (예 : %a C99에 변환 지정자가 추가됨). 이스케이프 처리되지 않은 % 자 (즉, %% 시퀀스가 ​​모두 제거 된 후 % 자의 수)에 * 자 (너비 지정자 일 수 있음)의 수를 더한 값보다 크지 않을 수도 있습니다.

보안 문제를 고려해야합니다. 사용자가 %n 형식 지정자를 제공하면 임의의 메모리 위치에 쓸 수 있습니다. 다른 경우에, 예를 들어, %f은 임의의 메모리 내용에서 %s, 심지어 %d 지정자로 출력되는 가비지 값을 야기하여 사용자가 필드 너비를 제공 할 수있게합니다. %255d 버퍼 오버플로가 발생할 수 있습니다. 예를 들어 다른 형식 체계를 고려하는 것이 더 스마트합니다. 토큰 (여전히 %d 일 수 있음)을 바꾸지 만 사용자가 printf 형식 문자열을 제공 할 수 없도록합니다.

+0

C99는 훌륭한 선택 일 것입니다. "더 크지 않다"는 내가 필요한 것에 충분할 수 있습니다. –

+0

신뢰할 수있는 환경에서 작업하고 있으므로 보안 문제에 대해 걱정하지 않아도 알 수 있습니다. 나는 네가 맞다고 생각한다. 주어진 문자열의 토큰을 내 파일 번호로 바꿀 것이다. –

+0

"* ... 사용자가 printf 형식 문자열을 제공 할 수 없도록 토큰 (% d 일 수 있음)을 교체하는 등의 다른 형식 지정 스키마를 고려하는 것이 현명합니다 ... *"예, 예 - ** 많이 ** 더 똑똑! – alk

관련 문제