16進数 -> 10進数


*static void hex2dec(const char *str, unsigned long *x)
{   
    short i = 0;
    short n;
    char c;

    *x = 0;
    while (*(str+i) != '\0') {
        if ('0' <= *(str+i) && *(str+i) <= '9')
            n = *(str+i) - '0';
        else if ('a' <= (c = tolower(*(str+i))) && c <= 'f')
            n = c - 'a' + 10;
        else
            exit(0);
        i++;
        *x = *x * 16 + n;
    }

    return;
}

10進数をRGBに


static void dec2rgb(const unsigned long dec, int *rgb)
{   
    rgb[0] = (dec >> 16);
    rgb[1] = (dec >> 8) & 0xff;
    rgb[2] = dec & 0xff;
}

ポインタのポインタ(ダブルポインタ)で構造体を扱う


#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define MAX_MEMBERS 10

typedef struct member_t {
    char *name;
    int age;
} member_t;

int main()
{
    member_t **members;
    member_t **p;
    int i;

    members = malloc(sizeof(member_t *) * MAX_MEMBERS);
    p = members;

    for (i = 0; i < MAX_MEMBERS; i++) {
        *p = malloc(sizeof(member_t *));
        (*p)->name = malloc(sizeof(char *));
        sprintf((*p)->name, "hoge%d", i);
        (*p)->age = i;
        p++;
    }

    for (i = 0; i < MAX_MEMBERS; i++) {
        printf("%s %d\n", (*members)->name, (*members)->age);
        members++;
    }

    return 0;
}

「**p」を用意する理由は、forで回すときにmembers++をしてしまうとmembersの最初のアドレスがどこかわからなくなってしまうから。なので、下記のように書いてpに一旦membersの先頭アドレスを取っておいてmemberesに戻すという方法も使える。

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define MAX_MEMBERS 10

typedef struct member_t {
    char *name;
    int age;
} member_t;

int main()
{
    member_t **members;
    member_t **p;
    int i;

    members = malloc(sizeof(member_t *) * MAX_MEMBERS);
    p = members;

    for (i = 0; i < MAX_MEMBERS; i++) {
        *members = malloc(sizeof(member_t *));
        (*members)->name = malloc(sizeof(char *));
        sprintf((*members)->name, "hoge%d", i);
        (*members)->age = i;
        members++;
    }

    members = p;

    for (i = 0; i < MAX_MEMBERS; i++) {
        printf("%s %d\n", (*members)->name, (*members)->age);
        members++;
    }

    return 0;
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

編集にはIDが必要です