하루에 하나씩 프로그램을 만들어보자. 크건 작던, 단순하던 복잡하든 꾸준함이 중요할 것이다.

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() 함수를 만들었다. 사용방법은 다음과 같다.

test.c

파일 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);
 
}
  • computer/programming/c_언어_생활_코딩.txt
  • Last modified: 3 years ago
  • by likewind