スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:スポンサー広告 

【C】QUERY_STRINGのような文字列の分解

前回書いたQUERY_STRINGのような文字列の分解のC言語版です。

どれだけいろんなことを自分でやらないといけないのかが分かります。
結構昔に書いたのでやたら懐かしいです。

言ってしまえば前回も今回も単なる文字列の分解ですが、メモ程度に書き残しておきます。


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

int amp_separator(const char *string, char **result){
    const char *idx;
    const char *current;
    int count = 0;
    int tmp_index = 0;

    idx = string;
    current = string;

    while(1){
        if(*idx == '&'){
            *result = (char *)malloc(sizeof(char) * count + 1);
            strncpy(*result, current, count);
            current = idx + 1;
            count = 0;
            tmp_index++;
            result++;
        }else if(*idx == '\0'){
            *result = (char *)malloc(sizeof(char) * count + 1);
            strncpy(*result, current, count);
            tmp_index++;
            break;
        }else{
            count++;
        }
        idx++;
    }

    return tmp_index;
}

char *eq_separator(const char *string, const char *key){

    const char *cindex;
    const char *current;
    char *result;
    int count = 0;

    cindex = string;
    current = string;

    while(1){
        if(*cindex == '='){
            result = (char *)malloc(sizeof(char) * count);
            strncpy(result, current, count);
            if(strcmp(result, key) == 0){
                free(result);
                strcpy(result, (cindex + 1));
                return result;
            }else{
                free(result);
                break;
            }
        }else if(*cindex == '\0'){
            break;
        }else{
            count++;
        }
        cindex++;
    }

    return NULL;
}

char *getValue(char *query, char *key){
    char *test[10];
    int count_token;
    int i;
    char *ret_val;

    count_token = amp_separator(query, test);

    for(i = 0; i < count_token; i++){
        ret_val = eq_separator(test[i], key);
        if(ret_val != NULL){
            return ret_val;
        }else{
            free(ret_val);
        }
        free(test[i]);
    }


    return NULL;
}

int main(void){
    char *query = "age=23&weight=80";
    char *key = "age";
    char *ret;

    ret = getValue(query, key);

    if(ret != NULL){
        printf("%s\n", ret);
    }

    return 0;
}


C++で書くことの利点はいくつかあげましたが、Cで書く利点はapxsコマンドが作ってくれるMakefileとかを気にしないでそのまま使える点ですかね。

つまりそんなにあげるほど利点はないということですかね。
何となく暇つぶしに書くにはもってこいの題材くらいでしょうかね。
スポンサーサイト

Tag:C/C++  Trackback:0 comment:0 

Comment

comment form
(編集・削除用):
管理者にだけ表示を許可
プロフィール

6rats

Author:6rats
こんにちは、ITベンチャーで働くエンジニアです
主に自分の周りで起きた技術的なことをメモとして書き残して行きます。
Android以外にもRuby/Ruby on RailsやFuelPHPなどなどたまにやります。基本的なスタンスとしては興味があるもしくは必要になったらいろんなことにチャレンジします。
最近はiOSアプリ開発を始めています。

購読
follow us in feedly
個人プロダクト

Androidアプリ

Twitterクライアント

Webアプリケーション

EcPriceWatch(Amazon価格の推移を計測、最安値を知らせるサービス)
Google AdSense
ブログ村
にほんブログ村 IT技術ブログへ
にほんブログ村
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。