포맷스트링 예제

세 개의 8자 열에서 세 정수에 대해 %8d%8d%8d와 같은 형식과 같이 필드 너비만 사용하여 표에 따라 많은 수가 발생하는 경우 필드 분리가 유지되지 않습니다. 필드 분리가 손실되어 출력이 손상될 수 있습니다. 스크립트의 구성 요소로 프로그램을 사용하도록 권장하는 시스템에서는 원래 프로그래머가 출력을 사람의 눈으로만 읽을 수 있는지 여부에 관계없이 이러한 손상된 데이터를 전달하여 추가 처리를 손상시킬 수 있습니다. 이러한 문제는 모든 테이블 형식 출력 형식에 명시적 구분 기호, 심지어 공백을 포함하여 제거할 수 있습니다. 이전예제를 %7d %7d %7d로 변경하기만 하면 숫자가 커질 때까지 동일한 서식을 지정하지만 명시적으로 포함된 공백으로 인해 출력에 병합되는 것을 명시적으로 방지할 수 있습니다. 문자열 데이터에도 유사한 전략이 적용됩니다. Linux 커널 printk 기능은 추가 형식 문자를 추가하여 일반 %p 사양을 사용하여 커널 구조를 표시하는 여러 가지 방법을 지원합니다. [7] 예를 들어 %pI4는 IPv4 주소를 점선 소수자 형태로 인쇄합니다. 이렇게 하면 정적 형식 문자열 검사(%p 부분)를 사용할 수 있으며 일반 printf와의 완벽한 호환성을 희생할 수 있습니다. Visual Basic과 C#은 정수 배열을 개체 배열로 변환할 수 없으므로 Format(String, Object[]) 메서드를 호출하기 전에 직접 변환을 수행해야 합니다. 다음 예제에서는 하나의 구현을 제공합니다. Format 메서드의 각 오버로드는 복합 서식 지정 기능을 사용하여 포맷 항목이라고 하는 0기반 인덱싱된 자리 표시자를 복합 형식 문자열에 포함합니다.

런타임시 각 형식 항목은 매개 변수 목록에서 해당 인수의 문자열 표현으로 바뀝니다. 인수값이 null이면 형식 항목이 String.Empty로 대체됩니다. 예를 들어 Format(문자열, 개체, 개체, 개체) 메서드에 대한 다음 호출에는 세 가지 형식 항목인 {0}, {1}및 {2}가 있는 형식 문자열과 세 개의 항목이 있는 인수 목록이 포함됩니다. Format 메서드는 인덱스 항목의 인덱스가 인수 목록의 인수 수보다 크거나 같으면 FormatException 예외를 throw합니다. 그러나 형식에는 여러 형식 항목이 동일한 인덱스를 가지는 한 인수보다 더 많은 형식 항목이 포함될 수 있습니다. 다음 예제에서 Format(String, Object) 메서드에 대한 호출에서 인수 목록에는 단일 인수가 있지만 형식 문자열에는 숫자의 소수점 값이 표시되고 다른 하나는 hexadecimal 값을 표시합니다. 개체, 변수 또는 식의 값을 다른 문자열에 삽입해야 하는 경우 String.Format을 사용합니다. 예를 들어 소수점 값 값을 문자열에 삽입하여 사용자에게 단일 문자열로 표시할 수 있습니다.

복합 형식 문자열의 각 형식 항목에 대한 메서드는 예제: 절편 공급자 및 로마 숫자 포맷터를 참조하십시오. 다음은 개체 목록에서 두 개의 형식 항목과 두 개의 개체를 사용하는 또 다른 예입니다.

Comments

No one has said anything yet.

Comments are closed.