오랜만에 포스팅!



C 공부하다가 문득 printf()로 format에 맞춰 정수를 출력할 때,

"%ul"과 "%lu"의 차이가 뭔지 궁금해졌다.


내가 알기로는 보통 "%ul"이라는 format을 많이 쓰는 걸로 알고 있는데

찾아보니 이는 틀린 format이라고 한다. - 실제 일부 컴파일러는 에러를 내뿜는다고 함.



그런 의미로 평소에 별 생각없이 사용했던 printf()가 어떤 녀석인지 정확히 알 필요가 있을 것 같다.


int printf(char *format, arg1, arg2, ...)


일반적으로 위의 인터페이스에 따라 사용하고는 한다. (이 외의 인터페이스는 귀찮으니 생략)


다들 알다시피 printfformat에 적힌 내용 중에 argument들을 변환하고 formatting 해준 다음,

standard output에 그 결과를 출력하는 일을 한다. return value로는 출력된 문자들의 갯수를 반환한다.


format에 입력할 수 있는 내용으로는 2가지가 있다. 

하나는 standard output stream에 그대로 복사되는 일반 문자들,

다른 하나는 argument들을 어떻게 변환/formatting할 것인지에 대한 conversion specification이다.


conversion specification 서식 = %[flag][width][.precision][length]specifier


'[]'으로 묶인 내용은 선택적인 값을 의미한다. (명시해도 그만, 안 해도 그만. 필요하다면 명시해야겠죠?)

서식을 하나씩 살펴보면,


flag : 왼쪽 or 오른쪽 정렬할 것인지에 대한 표시. 

명시를 안하면 기본은 오른쪽이고, 왼쪽 정렬하려면 '-'을 붙이면 된다.


width : 출력물(?)이 차지할 너비로 숫자 값이다. 

오른쪽 정렬 상태에서 너비가 출력할 문자열 길이보다 크다면, 왼쪽이 텅 비겠죠?


.precision : 앞에 '.'은 width 값이랑 precision 값을 구분하기 위해서 넣어준다. 

precision은 숫자 값으로 무엇을 출력하느냐에 따라 값의 의미가 다르다. 문자열 또는 실수를 출력한다면, 문자나 소수점 이하 숫자의 최대 길이를 의미한다. 정수를 출력한다면 숫자의 최소 길이를 의미한다.


length : 정수를 short로 출력하려면 'h', long으로 출력하려면 'l'(소문자 ell).


specifier : argument를 어떻게 해석할 것인지에 대한 문자 값.

구체적인 conversion table이 있으나 이 포스팅의 제목에 초점을 맞춰서 'u'만 언급한다.

'u' = int; unsigned decimal number.



"%ul"과 "%lu"의 차이를 알기 위해 길게 돌아왔는데, 아마 감이 왔을 것이다.


서식의 순서를 보면 length 한정자가 먼저 나오기때문에 "%lu"가 맞고, "%ul"은 틀리다.


예제 코드들을 보면 "%ul"이라고 쓰는 경우가 굉장히 많은데 (심지어 책에서도 보인다)

바로 알고 쓰도록 하자~!


* Reference

http://stackoverflow.com/questions/23852073/whats-the-difference-between-ul-and-lu-c-format-specifiers

- The C Programming Language 2nd edition (K&R) : 7.2 절


by kelicia 2015. 7. 5. 20:36
| 1 |