전체 글: 429개의 글

Sprintf 함수

Posted by ironmask84
2010. 11. 24. 14:15 컴퓨터공학/C언어 레퍼런스


sprintf
#include <stdio.h> // C++ 에서는 <cstdio>

int sprintf ( char * str, const char * format, ... );


str 에 데이터를 형식에 맞추어 쓴다.
str 가 가리키는 배열에 형식 문자열에 지정한 방식 대로 C 문자열을 쓴다. 쉽게 설명하자면, printf 에서 화면에 출력하는 대신에 화면에 출력할 문자열을 인자로 지정한 문자열에 쓴다는 것이다. 이 때, 인자로 지정한 배열의 크기는 배열에 쓰여질 문자열의 크기 보다 커야만 한다. 주의할 점은 sprintf 함수는 자동적으로 str 맨 마지막에 NULL  문자를 붙이기 때문에 항상 한 칸의 여유가 있어야 한다.

   인자
 

str

C 문자열이 저장될 char 배열을 가리키는 포인터
 
format

위 str 에 쓰여질 문자열을 포함하는 형식 문자열으로, 이는 형식 태그를 포함할 수 있다. 이 때, 형식 태그는 부수적 인자로 지정한 데이터와 치환되어 쓰여지게 된다. 이 때, 데이터가 치환되는 방식은 형식 태그에 의해 좌우된다. 따라서 부수적 인자의 개수는 적어도 형식 문자열에 사용된 형식 태그의 수 보다 많아야 한다.
  • 형식 태그는 아래와 같이 생겼다.

  • %[플래그(flag)][폭(width)][.정밀도][크기(length)]서식 문자(specifier)

  • 이 때 서식 문자(specifier) 는 대응하는 인자를 어떠한 형태로 표현할지를 결정하는데에 가장 중요한 역할을 한다.

  • 서식문자 출력 형태

    c 문자
    a
    d or i 부호 있는 십진법으로 나타난 정수 392
    e 지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다.
    3.9265e+2
    E 지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다. 3.9265E+2
    f 십진법으로 나타낸 부동 소수점 수
    392.65
    g %e 나 %f 보다 간략하게 출력 392.65
    G %E 나 %f 보다 간략하게 출력 392.65
    o 부호 있는 팔진수
    610
    s 문자열
    sample
    u 부호없는 십진법으로 나타낸 정수
    7235
    x 부호없는 16 진법으로 나타낸 정수 (소문자 사용)
    7fa
    X 부호없는 16 진법으로 나타낸 정수 (대문자 사용)
    7FA
    p 포인터 주소
    B800:0000
    n 아무것도 출력하지 않는다. 그 대신, 인자로 부호 있는 int 형을 가리키는 포인터를 전달해야 되는데, 여기에 현재까지 쓰여진 문자 수가 저장된다.
    % % 다음에 %를 또 붙이면 stdout 에 % 를 출력한다.

  • 위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다.

  • #include <stdio.h>
    int main()
    {
        int integer = 123;
        char character = 'c';
        char string[] = "hello, world";
        int* pointer = &integer;
        double pi = 3.141592;
        char buf[100];
        

        sprintf(buf, "integer : (decimal) %d (octal) %o \n", integer, integer);
        printf("%s \n", buf);

        sprintf(buf,"character : %c \n", character);
        printf("%s \n", buf);

        sprintf(buf,"string : %s \n", string);
        printf("%s \n", buf);

        sprintf(buf,"pointer addr : %p \n", pointer);
        printf("%s \n", buf);

        sprintf(buf,"floating point : %e // %f \n", pi, pi);
        printf("%s \n", buf);

        sprintf(buf,"percent symbol : %% \n");
        printf("%s \n", buf);

        return 0;

  • 출력 결과


  •    형식 태그에는 위 말고도 플래그, 폭, .정확도, 제한자(modifier), 부-서식문자(sub-specifiers) 에 관련된 정보들이 포함될 수 있다. 먼저 플래그를 살펴보면 플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 플래그는 아래와 같다.

    플래그 설명
    - 폭에 맞추어 왼쪽 정렬을 하여 출력한다. - 를 붙이지 않는다면 기본적으로 오른쪽 정렬이 되어 출력한다. (아래 폭 지정자 참조).
    + 출력 결과값이 양수인 경우라도 + 기호를 앞에 붙여서 출력하도록 한다. (물론 음수면 자동적으로 - 가 붙는다). 기본적으로 지정하지 않았을 경우 음수에만 앞에 - 가 붙는다. 
    (공백) 앞에 부호가 붙지 않는다면 한 칸을 띄어서 출력한다. (다시말해 123 은 " 123" 으로 출력되고 -123 은 "-123" 으로 출력된다)
    #
    o, x, X 서식 문자들과 사용되면 출력되는 값 앞에 각각 0, 0x, 0X 가 붙게 된다. (이 때 0 은 제외한다)
    e, E, f 서식 문자들과 사용되면 소수점 아래 수들이 없음에도 불구하고 강제적으로 소수점을 붙이도록 한다. 원래 소수점 아래 수들이 없다면 소수점을 붙이지 않는다.
    g 와 G 서식 문자들과 사용되면 e 와 E 일때와 동일한 작업을 하지만 소수들의 뒷부분에 붙는 0 들 (123.1200 등) 은 제거되지 않는다. 
    0 수들을 왼쪽으로 정렬하되 빈 칸을 삽입하는 대신에 0 을 삽입한다. (폭 지정자 참조)

  •   폭은 말그대로 출력되는 데이터의 폭을 지정해준다. 참고로 여기서의 폭(width)은 뒤에 나오는 길이(length) 와는 완전히 다른 개념이므로 유의 하시기 바란다.


  • 설명
    (수) 출력할 최소의 문자 개수. 만일 이 수 보다 출력할 수 보다 작다면 빈칸을 삽입하여 길이를 맞춘다. 대신에, 이 수 보다 출력할 수가 큰 수의 경우 잘려서 출력되지는 않는다.
    * 폭을 형식 문자열에 지정해서 받지 않지만, 그 대신에 형식 문자열 뒤에 오는 인자들에 넣어서 받는다. 이 때, 이는 정수 값이여야 하며 폭을 지정하는 변수 뒤에 출력할 데이터가 위치하면 된다.

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        char buffer[100];
        int i = 123;
        int j = -123;
        double f = 3.141592;

        sprintf(buffer, "폭 맞추기 \n");
        fputs (buffer, fp);
        sprintf(buffer, "i : %6d \n", i);
        fputs (buffer, fp);
        sprintf(buffer, "i : %7d \n", i);
        fputs (buffer, fp);
        sprintf(buffer, "i : %2d \n\n", i);
        fputs (buffer, fp);

        sprintf(buffer, "왼쪽 정렬 \n");
        fputs (buffer, fp);
        sprintf(buffer, "i : %5d끝 \n", i);
        fputs (buffer, fp);
        sprintf(buffer, "오른쪽 정렬 \n");
        fputs (buffer, fp);
        sprintf(buffer, "i : %-5d끝 \n\n", i);
        fputs (buffer, fp);

        sprintf(buffer, "# 문자의 사용 \n");
        fputs (buffer, fp);
        sprintf(buffer, "i : %#x \n", i);
        fputs (buffer, fp);
        sprintf(buffer, "i : %#X \n\n", i);
        fputs (buffer, fp);

        sprintf(buffer, "부호 붙이기 \n");
        fputs (buffer, fp);
        sprintf(buffer, "%+d, %+d \n", i,j);
        fputs (buffer, fp);
        return 0;
    }

  • 출력 결과

  • 파일에 쓰여진 모습

  • 정밀도는 말그대로 수치 데이터를 출력할 때 어떠한 정밀도로 출력하는지 (즉, 몇 자리 까지 출력해야 되는지) 를 지정해준다. 참고적으로 정밀도를 나타낼 때, 앞에 꼭 마침표(.) 을 찍는 것을 잊지 말기 바란다. 마침표를 찍는 이유는 앞에 폭과 구분을 하기 위해서 이다.

  • . 정밀도 설명
    .숫자 정수 지정자 (d,i,o,u,x,X) 의 경우 : 정밀도는 출력되야할 최소의 자리수를 일컫는다. 만일, 어떤 정수의 자리수가 정밀도 보다 작다면 앞에 0 이 붙어서 자리수를 맞추게 된다. 또한 자리수가 더 크다고 해서 정수를 잘라서 출력하지는 않는다. 만일 정밀도가 0 이라면, 소수점 뒤에 자리수를 출력하지 않는다.
    e,E, F 의 경우 : 여기서 정밀도는 소수점 이하 출력될 자리수를 의미한다.
    g, G 의 경우 : 출력될 유효 숫자의 수를 의미한다.
    s 의 경우 : 출력될 문자의 최대 개수를 의미한다. 원래는 널 문자를 만나기 전까지 모든 문자가 출력되었었다.
    c 의 경우 : 아무 효과 없다.
    만일 정밀도가 지정되지 않는다면 기본값으로 1 이 된다. 또한, 마침표(.) 을 찍었는데 아무런 숫자를 적지 않았다면 기본적으로 0 이 적혔다고 생각한다.
    .* 형식 문자열에서 정밀도를 나타내지는 않지만 뒤에 인자로 정밀도 값을 준다. 이 때 인자는 형식 태그가 적용되는 데이타 앞에 있어야 한다.  

       길이는 출력하는 데이터의 정확한 크기를 지정하는데 사용된다. 예를 들어서 %d 서식문자의 경우 막연하게 '정수형 데이터를 십진법으로 출력한다' 였지만 길이를 지정해주면 어떻나 크기로 데이터를 출력해야되는지 (int 냐 short 냐 등등) 을 지정할 수 있다. 

  • 길이
    설명
    h 인자를 short int 혹은 unsigned short int 로 생각한다. (오직 i, d, o, u , x, X 서식 문자에만 적용된다)
    l 정수 서식 문자(i,d,o,u,x, X) 에 사용되었을 경우 인자를 long int 나 unsigned long int 로 생각하며 c 나 s 에 사용되었을 경우 wide character 나 wide string 으로 생각한다.
    L 인자를 long double 로 생각한다. (오직 부동 소수점 서식 문자인 e,E,f,g, G 에만 적용된다)

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        double f = 3.141592;
        int i = 12345;
        char buffer[100];

        sprintf(buffer, "f : %.3f \n", f);
        printf("buf: %s \n", buffer);
        sprintf(buffer, "i : %.10d \n", i);
        printf("buf : %s \n", buffer);

        return 0;
    }

    출력 결과


    부수적인 인자

    형식 문자열에 따라 함수는 여러 인자들을 가지며, 각 인자는 형식 문자열의 각 형식 태그에 순차적으로 대응된다. 기본적으로 형식 문자열에 들어 있는 형식 태그의 수와 뒤따라 붙는 인자들의 수는 같아야 한다. (물론 .* 이나 * 과 같은 예외적인 상황은 제외한다)

       sprintf 함수의 활용 - 수를 문자열로 바꾸기
     

    sprintf 함수를 잘 이용하면 수를 손쉽게 문자열로 바꿀 수 있다. 바로 다음과 같이.

    #include <stdio.h>
    int main()
    {
        int i;
        char str[100];

        scanf("%d", &i);
        sprintf(str, "%d", i);

        printf("str : %s \n", str);

        return 0;
    }


    실행 결과


    i 의 값을 %d 의 형태로 str 에 문자열로 넣었으니 str 에는 i 의 값이 문자열의 형태로 변환된다.
    마찬가지 방법으로 i 의 값을 16 진수나 8 진수 형태로 (%x, %o) 넣을 수 도 있다.

       리턴값
     

    str 에 쓰기가 성공할 경우 쓰여진 총 문자의 개수가 반환된다. 이 때, 이 문자의 개수는 맨 마지막에 자동적으로 붙는 NULL 문자는 포함하지 않는다.
    실패할 경우 음수가 리턴된다.

       실행 예제
     

    /*

    sprintf 함수 예제
    이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
    에서 가져왔습니다.

    */
    #include <stdio.h>
    int main ()
    {
        char buffer [50];
        int n, a=5, b=3;
        n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
        printf ("[%s] is a %d char long string\n",buffer,n);
        return 0;
    }


    실행 결과



       연관된 함수
     

    • printf  :  표준 출력(stdout) 에 데이터를 형식에 맞추어 출력한다.
    • sscanf  :  문자열에서 데이터를 형식에 맞추어 읽는다.

     

    첫쨰날 2010-01-20

    Posted by ironmask84
    2010. 2. 9. 23:43 해외여행/일본 - 2010





    부산에 살지만서도, 저렴한 제주항공을 이용하기 위해
    KTX를 타고 김포공항까지 가서 비행기를 타게 되었다 ㅋㅋ
    그러나.. 이게 왠 날벼락.. 서울엔 비가 오고있었고.. 김포공항 주위에는 안개가 자욱했다..


    그리고 혹시나 했는데.. 아래 사진과 같은 상황이...내가 탈 비행기는 14:00 오사카행...


    캔슬되는 항공편들도 몇개 생기고 해서.. 그 동안 세워놨던 계획에 빵꾸가 나버리나 싶었지만..
    다행히도 제주공항에서 비행기가 출발을 했고, 김포공항에 도착하여 19시에 출발했다..
    항공사에서도 미안해하며 탑승하기전 롯데리아 새우버거를 나눠주더군..
    그리곤 아래사진과 같이 제주항공의 기내식은.. 삼각김밥과 감귤쥬스 ㅋㅋㅋㅋ



    고맙게도 내 친구의 일본인 친구가 간사이 공항에 마중나와 있었고 정말 고맙게도 이것저것 챙겨주었다..



    처음으로 타게된 일본 전철역 ㅎㅎㅎ
    아무튼 어떤 경로로 가게 된건지 기억은 안나지만 .... ㅡ_ㅡ..
    간사이 공항역에서 난바역으로 가기위한 시작..



    드디어 난바에 도착했지만...
    기환이의 일본친구와 저녁을 먹을 시간도 없이 ㅡ_ㅡ...
    야간버스 탑승장소를 찾기 위해 그냥 난바역 근처를 이렇게 활보하기만...
    아래 사진처럼 지상에도 역이랑 연결되어서 지붕이 덮여있는 상가 공간이 많았던 것 같다.





    늦게 도착해서, 오사카 구경을 거의 못하고 도쿄로 가는 야간 버스 탑승 위치를 찾기에 매우 바빴다.
    사실 그 날 비행기가 캔슬되면, 미리 예약해놓은 야간버스를 날려버리는 것이 가장 큰 걱정이었다. ㅋㅋ
    오사카-> 도쿄 행으로 거금 6100엔짜리.. 고급 야간버스로 했었다 ㅋ
    대에충 간식거리만 사놓고, 이러고 있었다...
    아래 사진은 야간 버스를 타기전 화장실에서 한 컷 ㅋㅋ


    이것이 일본 야간 버스 ㅋㅋ


    여행 첫날 부터 야간버스를 탈려니 이거 뭐 체력소모가 ㅋㅋㅋ
    아무튼 이렇게 첫날 일정은 마무리 되었다..
    아래는 버스 내부 사진 ㅋ


     

    일본 여행 시작~

    Posted by ironmask84
    2010. 1. 19. 23:48 해외여행/일본 - 2010







    1/11에 여권을 수령하였고~ 전자여권~ 멋있다~ ㅋㅋ


    어제 환전도 50,000엔치 했다. ㅎㅎㅎ 조금 부족할려나.. 잘 아껴써야쥐 훗..


    이제 짐도 간지나는 쌤소나이트~ 캐리어에 다 쌌고~
    적게 넣을려고 했는데 한 가득이더라..

    대략 여행 계획짜고 하는데 10일정도 걸렸다..
    이제 내일이면 일본으로 출국!

    6박 7일의 여행!
    구경잘하고 무사히 돌아오자! ㅋㅋㅋ



     

    2009년 하반기 까지의 과정과 열심히 익힌 면접 노하우

    Posted by ironmask84
    2010. 1. 9. 14:48 About ironmask/취업준비


    2009년 동안은 참 취업을 대비해 보낸 시간들이 참 많았다..
    상반기에는 학교 수업을 17학점 들으면서 큰 여유는 없었지만, 2번의 인턴 면접 기회가 있었다.
    그 두 번의 면접 동안 느낀 것은 "이런식으로 준비해서는 취업 하겠나?" 라는 생각이 머리에 맴돌았고,
    두려움은 커져만 갔다..

    대학교 마지막 여름 방학동안 자기소개서 스터디와 면접 스터디에 올인하고 싶었지만,
    토익을 꼭 800점대로 만들어야 겠다는 생각에 8월까지 토익 공부를 했다..
    7월 토익 성적은 실패로 돌아갔고, 8월 토익 성적이 9월 18일에 공개되면서 안도의 한숨을 ^^..
    하지만, 그것도 잠시 면접의 압박이 다가왔다.

    토익을 하면서도 면접스터디를 조금씩 했었지만, 제대로 스터디가 진행되지 않아 불안한 마음으로
    9월 부터는 본격적으로 면접 준비를 하고자 하였다.
    학교 근처에 면접을 위한 강의를 개설하는 곳이 있었는데 일명 "T7 아카데미" 라는 곳이었다.
    명칭은 "T7 아카데미"이고, 장소는 학교 근처 토즈라는 스터디룸을 운영하는 분이셨다.
    그 분을 코치님으로 부르며, 면접 요령과 마음가짐에 대한 코칭을 받았다.

    하지만, 9월 부터 대량으로 쏟아지는 공채들에 지원하느라고, 또 다시 면접 연습에 올인할 수가 없었다..
    자기소개서를 쓰면서, 점차 요령이 생기기 시작했고 먼저 써놓은것 을 재탕하기도 하면서 30~40곳 정도 지원했다.
    막상 공채 기간이 되니, 컴퓨터공학 전공으로 지원할 수 있는 분야가 이렇게 많은 줄 알게 되기도 하였다. ㅋㅋ

    정말 가고 싶은 곳들은 정성을 많이 들여서 제출하였고, 차츰 서류 발표가 나기 시작했다.
    서류가 발표나면, 인적성 시험 부터 쳐야한다..
    거기다 인적성 시험을 합격하고 나면, 1,2차 면접..  뭔 채용시스템이 이리도 빡센지..

    과거에 겪었던 면접 경험과 계속적인 연습을 통해 조금씩 면접도 익숙해져 갔다.
    하지만, 정말 가고 싶은 곳의 면접은 떨릴 수 밖에 없더라 ㅋㅋ

    상반기 때 2번의 면접의 기회가 있었고, 하반기 때는 7번의 면접을 봤던 걸로 기억한다.
    물론 더 많은 기회가 있었지만, 면접 일정이 겹치거나 원하는 곳의 합격한 이후로는 가지 않은 곳도 있었다.

    아무튼 총 9번의 면접 경험을 토대로 느낀 노하우를 써보겠다.
    1. 면접은 "자신감" 이다.
        면접에서 나오는 질문을 모두 예상할 수는 없다. 받게 될 반 이상의 질문은 예상 못한 질문일 것이다.
        그런 질문을 받게 되더라도 최대한 편안한 마음으로 긍정적인 답변을 하면 된다.

    2. 항상 얼굴에는 "미소"를 띄고 있어야 한다.
        어떠한 황당한 질문을 받게 되거나, 면접관이 갑자기 성질을 돋구는 질문을 할지라도 무조건 웃는 얼굴로
        임해야 한다. 사실 면접을 겪어보면 처음에 손발이 오그라들게 하는 자기 소개하는 것 부터 해서 질문에
        대답하는 수준이 면접자들 대부분이 고만고만 할 것이다. 그럴때는 당연히 웃는 얼굴로 여유를 지닌 자가
        눈에 띄지 않겠는가.

    3. 연습 또 연습이다.
        면접 경험이 많더라도 연습은 당연한 것이다. 
        자기소개서를 숙지하는 것은 물론이고, 면접을 보게 될 기업에 대해서 철저히 사전 조사를 해야 할 것이다.
        그리고 면접장에 입실하는 것 부터 퇴실하는 절차까지 꼼꼼하게 미리 연습해보는것이 좋다.
        특히, 자기소개와 지원동기는 자연스럽게 말할 수 있을정도로 반복해서 연습하길 바란다.

    4. 불합격해도 너무 기죽지 마라.
        나 자신도 3번째 면접까지 불합격하였다. 말을 능숙하게 잘하는 사람은 첫 면접에서부터 합격하는 경우가
        많겠지만, 나 처럼 그런 것에 약한 사람들은 몇 번 실패를 하게 될 것이다. 하지만 기죽을 필요는 없다.
        몇번 해보면, 어느정도 적응이 되고 한 번 합격 해보고 난 뒤에는 더욱 여유가 생길 것이다.

    거창하게 노하우라고 까지 해놓고, 이 정도 밖에 생각이 안나서 부끄럽다.. ㅋㅋ
    위에서 가장 중요한 부분은 당연 1, 2번 이라고 생각한다.
    나는 특히, 2번 얼굴에 미소가 너무 잘 안되서, 꽤나 고생했다.. 마지막 면접에서야 비로서 어느정도 미소가 지어졌다고나 할까.. 그 때는 좀 편안한 분위기의 면접이라서 그런 것일 수도 있겠지만. ㅋㅋ..

    앞으로 계속 채용시스템은 난이도가 올라갈 것이라고 생각한다. 과거보다 현재가 훨씬 어려워진것 처럼..
    뭐 대단한 팁은 안되겠지만, 취업을 준비하는 분들에게 조금이나마 도움이 되었으면 하면서 이 글을 마친다. ^^

     

    2009년을 보내고...

    Posted by ironmask84
    2009. 12. 31. 21:32 생각과 일상/오늘의 일상



    벌써 이렇게 2009년이 가는구나..
    올 한 해는 취업을 위해 보낸 시간이 가장 많다.
    뭐 좀 더 원하는 곳도 있었지만, 지금 합격한 곳에 정을 붙이고 나아가야지.

    학교 수업들은 2,3학년 때에 미리 많이 들어두어서 널널하게 듣게 된 1년이지만,
    취업으로의 스트레스는 장난이 아니었다.
    취업 준비를 하면서 얻게된 한 가지 장점은
    자기소개서를 쓰고, 면접 연습을 하면서 자신에 대해 더욱 많이 알게된 것이다.

    앞으로 짧게는 1년, 3년 좀 더 길게는 5년, 10년 뒤에 다시 이 글을 봤을때,
    과연 나는 올바른 선택을 했다고 생각하며 이 때를 회상할 수 있을까..

    아직 못해본 것도 많고, 못 이룬 것도 많다.
    다시금 내 꿈을 정리해보고, 구체적인 계획을 잡아야 할 것만 같다.

    행복한 삶?
    2010년엔 하나씩 실현해 갔으면 한다.

    이뤄야 할 것
    => 즐겁고 늙어서도 할 수 있는 취미 만들기, 애인 만들기, 입사 후 확고한 적응, 재테크, 
        꿈을 이루기 위한 기술 연마, 영어 회화 등등