프로그래밍/C2012. 3. 28. 11:40

sscanf는 manpage에 다음과 같이 정의되어 있다.

#include <stdio.h>

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


scanf가 standard input stream, stdin, 에서 input을 읽어오는 반면, sscanf는 str이라는 문자열(character string)에서 입력을 받아온다

즉, 메모리에서(const char *str) 받은 값을 포맷 형식에 맞게 읽어오는 것이다.

간단한 예제를 보자.

 
예제출처: 초보자를 위한 Linux & Unix C 프로그래밍


위의 예제에서는 이미 정의되어 있는 값을 sprintf를 이용해 buff에 넣어두었다가, sscanf를 통해 포맷에 맞게 읽어오는 예제이다.


가끔 이 포맷으로 간편한 작업을 해낼 수도 있는데, 다음의 예제를 보면,


예제출처: Microsoft Support @http://support.microsoft.com/kb/38335/eng


sscanf를 이용해서 내부 버퍼에서 ','(컴마)로 문자를 잘라서 읽어오는 것이다.  (이렇게 하기 위해서 필요한 포맷은 %[^',']이다)  물론 일반적인 토큰화를 해야 한다면 strtok을 사용하는 걸 추천한다. 


말 나온 김에 포맷에 대해서 정리해 보자.


  %o 

   8진 정수

  %d 

  10진 정수

  %ld

  long형 10진 정수

  %x

  16진 정수

  %f

  float 형

  %lf

  double 형

  %c

  문자

  %s

  문자열

  %n

  읽은 문자 갯수 

주의 할 점은 포맷을 잘못 사용 할 경우, 이어지는 모든 데이터가 다 틀어지게 된다는 것이다.  sscanf를 사용해서 받은 값이 이상하거나 할 때는, 포맷을 제대로 썼는지 확인하자.



'프로그래밍 > C' 카테고리의 다른 글

정적 라이브러리, 동적 라이브러리 만들기  (0) 2012.04.04
sprintf 사용법  (0) 2012.04.03
exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
C의 역사  (0) 2012.02.19
Posted by code cat
프로그래밍/C2012. 2. 29. 11:10

출처: http://www.mkssoftware.com/docs/man3/exit.3.asp


exit() 함수는 atexit() 함수로 등록된 모든 함수들을 역순서로 호출한다.  


그 후, exit()는 데이터가 남겨있는 버퍼를 가진 모든 오픈 스트림을 비우고, 닫는다(모든 오픈 스트림에 fclose()를 하는 것과 유사하다).  마지막으로 exit()_exit(status)를 호출하여 호스트 환경으로 제어를 넘겨준다.


만약 exit(0) 혹은 exit(EXIT_SUCCESS)라면,  exit()는 임플리멘테이션에 정의된 성공적인 상태의 마침을 반환하며

만약 exit(EXIT_FAILURE)라면, exit()는 임플리멘테이션에 정의된 실패상태의 마침을 반환한다.  


마지막으로 이식성을 위해,


exit(0), exit(1)     대신 

exit(EXIT_SUCCESS), exit(EXIT_FAILURE)


를 사용하자.

'프로그래밍 > C' 카테고리의 다른 글

sprintf 사용법  (0) 2012.04.03
sscanf 사용법  (0) 2012.03.28
file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
Posted by code cat
프로그래밍/C2012. 2. 28. 17:32

다음과 같이 작성하면 간단하게 구현할 수 있다. main은 생략했다.


struct안의 char는 char*형을 쓰면 오동작을 한다.

'프로그래밍 > C' 카테고리의 다른 글

sscanf 사용법  (0) 2012.03.28
exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
Posted by code cat
프로그래밍/C2012. 2. 19. 14:28
출처: secure coding in c and c++

C언어의 아버지 데니스 리치는 The Second History of Programming Language 컨퍼런스에서 C언어의 개발을 발표하였고, 1970년 초반  UNIX 오퍼레이팅 시스템에서의 시스템 구현 언어로서의 역활을 하기 위해 만들어 졌다.  C는 typeless 언어 B에서 파생되었으며, B언어 또한 BCPL이라는 언어에서 파생되었다.  BCPL은 1960 년대 마틴 리차드가 설계했으며 1920년 초반 여러 프로젝트에서 사용되었다. B는 type이 없는 C, 혹은 더 정확하게 말하자면, 메모리에 8K 바이트로 압축된 BCPL이라고 할 수 있겠다.


그 후,  1978년에 "K&R"이라고 자주 불리우는 'The C Programming Language'이  출판되었다.  이 시점의 C언어에 있었던 많은 변화들은 interdata 8/32라는 컴퓨터로 코드를 포팅하는 과정에서 생겨났으며 이 당시 C는 여전히 typeless라는 성격을 강하게 지니고 있었다.  


1983년 ANSI는 X3J11위원회를 설립했다. ANSI의 목표[ANSI 89]는 "명확하고, 일관되었으며, 모호하지 않는 C의 스탠다드를 만들어 C언어 환경안에서 사용자 프로그램의 portability 를 지원하고, 일반적인, 기존에 이미 존재하는 C의 정의를 코드화"하는 것이었다.  1989 년 말에 X3J11은 [ANSI 89]라는 리포트를 만들어 냈으며 이는 이후 ISO / IEC 9899-1990로 ISO에 의해 승인되었다.   물론, ANSI 표준의 섹션의 재배치가 있었고 ISO표준에서는 조항이 되었다고 하나 이 둘 사이의 기술적인 차이는 없다.  이 표준은 두 형태로, 일반적으로 C89와 같은, 또는 간혹 C90로 알려져 있다.


이 스탠다드는 우리가 흔히 아는 C89가 되었다.(혹은 승인 기준으로 C90이라고 불리우기도 한다.)  

후일 이 스탠다드의 첫번째 에디션은 수정을 거쳐 AMD1:1995가 되었다.(이 또한 C95라고 알려졌다)

이 또한 계속적인 수정( ISO/IEC 9899 )으로  인해 우리가 흔히 알고 있는 C99가 되었다.

'프로그래밍 > C' 카테고리의 다른 글

exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
Posted by code cat
프로그래밍/C2012. 2. 5. 07:53
상수를 사용 할 일이 있을 때, 프로그래밍 언어(c vs c++)가 어느거냐에 따라서 호불호가 갈릴 수도 있겠지만 되도록 #define은 피하는게 좋다는 것은 변함이 없겠다.

#define은 전처리기에서 정의된 문자가 정의된 값으로 바뀌어서 처리된다.

예를 들어
#define BUF_SZ 1024

char buf[BUF_SZ];

라고 하면 전처리기의 실행 후에는

#define BUF_SZ 1024

char buf[1024];

라고 바뀐다. 이 후의 컴파일 과정에서는 BUF_SZ라는 매크로 심볼을 참조 할 수 없다. 여기서 발생할 수 있는 문제가 보통 컴파일러는 이 매크로 이름을 디버거로 넘겨주는 심볼 리스트에 포함시키지 않는다.
gcc 의 경우, -g3으로 매크로 정보를 포함시킬 있다.

또한 매크로는 scope에 대한 조절을 하기 어렵다. 예를 들어,
int getFoo(void)
{
#define LOCAL_VAL 124
....
}

는 지역적 scope를 가지지 않는다.

iPhone 에서 작성된 글입니다.

'프로그래밍 > C' 카테고리의 다른 글

file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
C의 역사  (0) 2012.02.19
enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
Posted by code cat
프로그래밍/C2012. 2. 4. 14:58



라고 enum 타입을 정의 했다고 치자.
그렇다면 이 enum 타입을 리턴하는 함수는 어떻게 정의 할까? c++ 라면 Food라고 해 줄 수 있지만, c에서는 아쉽게도 다음과 같이 써 줘야 한다.



이렇게 하는게 싫다면 typedef 으로 정의해 주면 된다.


'프로그래밍 > C' 카테고리의 다른 글

C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 30. 08:07

system 으로 쉘 명령어를 실행시키거나 프로세스를 실행시키는건 대체적으로 좋지 않은 방법이다. 

이는 system 이 동작하기 위해 먼저 쉘을 실행시키기 때문이다. 이렇게 시작된 쉘은 각 설치된 쉘의 환경등에 따라 다른 동작성을 보일 수 있기 때문이다. 


그래서 보통 대체적으로 쓰이는 것이, exec 이며 exec 계열은 다음과 같이 나뉘어진다. 
execl, execle, execlp
execv, execve, execvp

그러나 이런 exec 또한 프로세스를 실행시킨 뒤 에러가 나지 않는 한 리턴되지 않는다.

즉,우리가 처음 시작한 프로세스에서 여러개의 프로세스를 실행시키기에는 부적합하다는 것이다. 


그래서 대신 자식 프로세스를 생성하거나 쓰레드를 생성하는 것이다

'프로그래밍 > C' 카테고리의 다른 글

enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 25. 18:34
signal 라이브러리 함수은 다음과 같다.

void (*signal(int sig, void (*func)(int)))(int);

예)
위에 예제처럼 printf를 시그널 핸들러 함수에서 하는건 안전하지 않다.
그보다는, 시그널 핸들러가 플래그를 set하고 메인 함수에서 flag를 체크해서 그에 맞게 처리하는게 좋다.

하지만 X/Open 및 UNIX specifications은 sigaction이라는 프로그래밍 인터페이스를 사용하기를 권장한다.

#include <signal.n>
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

설명
sigaction structure는 다음의 멤버들을 가지고 있다.
    void (*) (int) sa_handler  /* 함수, SIG_DFL, SIG_IGN*/
    sigset_t sa_mask            /* sa_handler에서 블록할 signal*/
    int sa_flags                    /* signal action modifier*/

sigaction 함수는 시그널 sig와 연관된 action을 설정한다.
 - oact가 null이 아닌 경우, sigaction은 이전의 signal action을 쓴다.
 -- act가 null인 경우, 아무 일도 안한다.
 -- act가 null이 아닌 경우, 시그널을 위한 action이 설정된다.

act에 의해 가리켜지는 sigaction 안에 있는 sa_handler는 시그널 sig가 들어오면 불려지는 함수에 대한 포인터이다.
sa_mask는 sa_handler가 불리기 전에 프로세스의 시그널 mask에 추가될 시그널 세트들을 설정한다.(이 세트들은 블록되어 프로세스로 전달되지 않는 시그널들이다.  sa_mask를 사용하면 race condition을 방지할 수 있다)

Return value
sigaction이 성공적일 경우, 0을 리턴하고 아닌 경우 -1을 리턴한다. A

'프로그래밍 > C' 카테고리의 다른 글

enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
Posted by code cat
프로그래밍/C2011. 11. 29. 20:39

이런 에러가 나는 경우는, c는 함수가 다른 함수 안에나 블록 속에 정의되는 것을 허락하지 않기 때문이다.

바꿔 쉽게 말하자면, xxxx라는 함수 위에 있는 함수나 블록 중에서 }를 닫는 것을 잊어 먹었을 경우인 것이다.

{}을 잘 닫았는지 확인하고, 만약 혹시라도 블록 안에나 다른 함수에서 함수를 정의하려고 한다면, 이건 C 표준이 허락치 않는 걸 삽질하려는 것이다.

'프로그래밍 > C' 카테고리의 다른 글

system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
전처리기 (1)  (0) 2011.11.09
Posted by code cat
프로그래밍/C2011. 11. 29. 14:51

참조(C 펀더멘탈, 전웅 저, 한빛 미디어)

기억수명(storage duration, extent, lifetime)은 대상체에만 적용되는 개념이다.  대상체의 기억수명이란 어떤 대상체가 값을 저장하기 위해 할당받은 메모리를 차지하고 있는 시간을 말한다.  다시 말해, 프로그램에 선언된 모든 대상체가 시작부터 종료까지 계속 메모리에 상주하는게 아니라, 대상체의 기억수명이라는 것에 따라, 어느 순간 할당(alloc)받고  해제(dealloc)하는 것을 말한다.

C가 제공하는 대상체의 기억 수명은,

  • static storage duration 정적 기억수명
  • auto storage duration  자동 기억 수명
  • allocated storage duration  할당 기억 수명

이중 allocated storage duration 할당 기억 수명은 프로그램의 위치에 상관없이 메모리를 원하는 순간 요청하고 해제할 수 있는 기억 수명이다.  malloc()이 대표적인 예가 되겠다.

정적 기억수명과 자동 기억수명, 그리고 할당 기억수명의 가장 큰 차이는 할당되는 대상체의 크기가 프로그램 실행 중에 고정되어 있는지 여부이다.  언어 부분에 의해 지원되는 두 종류(자동, 정적)의 기억수명을 갖는 대상체는 프로그램이 실행되기 전에 그 크기가 상수로 고정되어 있어야 한다.

정적 기억수명을 갖는 대상체는 프로그램이 시작해서 종료될 때까지 메모리에 항상 존재한다.

자동 기억수명을 갖는 대상체는 그 대상체를 지칭하는 통용 범위와 운명을 함께 한다.

Posted by code cat