하루에 하나씩 프로그램을 만들어보자. 크건 작던, 단순하던 복잡하든 꾸준함이 중요할 것이다.
Linked List(링크드리스트)
단순한 링크를 생성하고, 추가하고 삭제하는 함수를 각각 정의하였다.
#include <stdio.h> #include <stdlib.h> typedef struct nnode { int value; struct nnode *next; }ZNODE; ZNODE *head; ZNODE *tail; void init_list(void) { head = (ZNODE*)malloc(sizeof(ZNODE)); tail = (ZNODE*)malloc(sizeof(ZNODE)); head->value = 0; tail->value = 0; head->next = tail; } void print_list(void) { ZNODE *p; p = head->next; while(p != tail) { printf("value = %d\n", p->value); p = p->next; } } void add_list(int value) { ZNODE *new; ZNODE *p; new = (ZNODE*)malloc(sizeof(ZNODE)); new->value = value; p = head; while(p->next != tail) { p = p->next; } p->next = new; new->next = tail; } void del_list(int value) { ZNODE *s; ZNODE *p; p = head; while(p != tail) { if(p->value == value) { s->next = p->next; free(p); return; } s = p; p = p->next; } } int main(void) { init_list(); add_list(44); add_list(77); add_list(22); add_list(98); del_list(77); del_list(22); print_list(); return 0; }
posix_spawn
기존의 system 함수를 사용했을 때, fork(), exec() 에 의해 부모 프로세스가 사용하는 메모리 사이즈 만큼의 용량이 똑같이 복사가 된다. 예를 들어, main 프로그램에서 200MB 의 메모리를 사용한다고 하면, 수행도중 시스템 함수를 호출시, 200MB 의 빈 메모리 공간이 있어야 정상적으로 수행된다.
이는 상당히 불 필요한 작업이기 때문에 이를 방지하기 위해서 posix_spawn() 함수를 만들었다. 사용방법은 다음과 같다.
파일 R/W
파일에서의 문자열 검색
단어 뒤집기
여러 단어로 이루어진 문장에서 단어별로 위치를 반대로 바꾸는 프로그램이다.
#include <stdio.h> #include <string.h> #include <stdbool.h> bool reverseWords(char str[]) { char *buffer; int slen, tokenReadPos, wordReadPos, wordEnd, writePos = 0; slen=strlen(str); tokenReadPos = slen - 1; buffer = (char *)malloc(slen +1); if(!buffer) return false; while(tokenReadPos >= 0) { if(str[tokenReadPos] == ' ') { buffer[writePos++] = str[tokenReadPos--]; } else { wordEnd = tokenReadPos; while(tokenReadPos >= 0 && str[tokenReadPos] != ' ') tokenReadPos--; wordReadPos = tokenReadPos +1; while(wordReadPos <= wordEnd) { buffer[writePos++] = str[wordReadPos++]; } } } buffer[writePos] = '\0'; strncpy(str, buffer, slen+1); free(buffer); return true; } int main(void) { char test[30] = "hello wjkim test"; printf("%s\n", test); reverseWords(test); printf("%s\n", test); }