헬마입니다.

오늘도 여전히 학교와 회사를 열심히(?) 다니고 있습니다. ^^

오늘은 오전에 -운영체제- ( 유닉스 운영체제 겠죠 ^^ ) 수업이었는데,

read, open 등의 함수를 설명하다가 실습 예제가 하나 나왔습니다.

#include 

main( argc, argv ) int argc; char* argv[];
{
    int fd, skval;
    char c;

    if( argc != 2 )
        return -1;
    fd = open( argv[1], O_RDONLY );
    if( fd == - 1 )
        return -1;
    printf("File FD Number = %d\n", fd );
    while( ( skval = read( fd, &c, 1 ) == 1 )
    {
         printf("Read Char : %c\n", c );
         skval = lseek( fd, 9L, 1 );
         printf("New Seek Val = %d\n", skval );
    }
}
위와 같은 프로그램이었는데 이걸 5글자씩 읽어서 출력하느걸로 고치는거였습니다. 그러면서 문자배열을 써보라더군요.
뭐 쉬운일이니 원하시는대로 했습니다.
#include 
#include 

main( argc, argv ) int argc; char* argv[];
{
    int fd, skval;
    char szData[6];

    if( argc != 2 )
        return -1;
    fd = open( argv[1], O_RDONLY );
    if( fd == - 1 )
        return -1;
    printf("File FD Number = %d\n", fd );
    memet( szData, '\0', sizeof(szData) );
    while( ( skval = read( fd, szData, 5 ) == 5 )
    {
         printf("Read Char : %s\n", szData );
         skval = lseek( fd, 9L, 1 );
         printf("New Seek Val = %d\n", skval );
         memset( szData, '\0', sizeof(szData) );
    }
}
로 고쳤습니다. 기억에 의존해서 정확한지 잘 모르겠네요.
컴파일도 잘 대고 깔끔하게 5글자씩 출력이 되었습니다.
그런데, 교수님께서 보시더니 왜 문자배열을 6개로 잡았느냐고 하면서 5개로 줄여보라고 하더군요.
그래서 5개로 줄이고 실행하니 당연히 널문자가 없어서 뒤에 쓰레기 문자가 잔뜩 같이 출력...
그러니 이번엔 교수님이 printf 에서 %5s 해서 길이 지정을 하면 되는거 아니냐고 해보라고 하더군요.
해보고 역시 안대죠. 교수님 %5s 는 최소 출력 길이 너비를 지정하는거지 읽는 길이를 지정하는게 아니란 말입니다. ㅠㅠ
printf 에는 읽을 길이 지정하는게 없냐고 하시더니 없다고 하니까 그냥 가시더군요.. ㅠㅠ
유닉스면 C언어와 굉장히 밀접한 운영체제인데, C언어를 제대로 해보신분인지 순간 놀랐습니다.
C언어에서 문자열이 어떤식으로 다뤄지는지 정말 알고계시는건지..
더구나 나중에 5개로 잡으면 찌거기 문자가 나올텐데 이건 정상작동이고 알고리즘 오류가 아니라고 주장하는 모습에 감동했씁니다
그대로 제품 만들면 100% 망할텐데...

'잡담' 카테고리의 다른 글

와우 하다가 한 장면..  (0) 2009.10.10
ATi RADEON HD 5870  (4) 2009.10.01
학교에서 또 한번 좌절...  (4) 2009.09.30
벌집.... 구경하다...  (6) 2009.08.24
VMWare 7.0 Technology Preview Build. 185517  (1) 2009.08.23
미디어법 통과를 보며 생각나는 장면...  (1) 2009.07.23

댓글을 달아 주세요

  1. warship 2009.09.30 16:19 신고 Address Modify/Delete Reply

    printf("%.5s", szData);
    점(.)을 찍으면 딱 5자리만 읽고,

    printf("%.*s", 5, szData);
    이것도 위와 같은 동작을....

    저도 몰랐었는데 얼마전에 알았다는

    • BlogIcon 헬마 2009.09.30 19:19 신고 Address Modify/Delete

      MSDN을 찾아보았는데 일단 의미가 약간 다릅니다.

      ---

      The third optional field of the format specification is the precision specification. It specifies a nonnegative decimal integer, preceded by a period (.), which specifies the number of characters to be printed, the number of decimal places, or the number of significant digits (see the How Precision Values Affect Type table). Unlike the width specification, the precision specification can cause either truncation of the output value or rounding of a floating-point value. If precision is specified as 0 and the value to be converted is 0, the result is no characters output, as shown below:

      ---
      제가 판단하기로

      위의 . 을 이용한 방식은, 읽기는 많이 있습니다. 쭉~~, 읽지만 출력은 딱 5글자만 합니다. 따라서, 겉으로 보기엔 5글자 이상을 초과해서 읽었다는 사실자체에는 변함이 없습니다.

      차이점이라면, %5s 하면 최소 5글자로 그 이상 출력가능지만
      %.5s 하면 무조건 5글자 출력이라는 거겠죠.

      두번째 방법인 * 를 쓰는 방식은 현재는 거의 쓰이지 않는 방식으로 알고 있습니다. 추천되지도 않구요. 보안 위험성때문이지요. printf_s 같은 보안이 강화된 함수에서는 지원이 제거된걸로 알고 있습니다.

      사실 머, 보안위험을 따지자면 printf 자체가 문제인거나 다름없죠 ^^

      C++ 고유의 가변인자 전달 방법만 있었어도 printf 는 사라졌을거라 생각합니다.

  2. blueasa 2009.10.01 02:48 신고 Address Modify/Delete Reply

    가끔씩 헬마님 글보면서 느끼는거지만..
    교수랑 학생이랑 바뀐거 아닌가요? ㅇ_ㅇ;

  3. BlogIcon neoevoke 2009.10.08 16:16 신고 Address Modify/Delete Reply

    교수님을 가르치시느라 고생하십니다 ^^

    소스코드 올리실때는 textarea로 둘러싸 주시면 맨 밑에 </fncntl.h> 이런거 나오는거 없어져요