C 언어 생활 코딩
하루에 하나씩 프로그램을 만들어보자. 크건 작던, 단순하던 복잡하든 꾸준함이 중요할 것이다.
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);
}