[プログラミング]の検索結果


10進数を2進数文字列に変換する関数は前に作成してますが、逆に「1101」「10110000」などの2進数文字列を10進数の整数値に変換するC言語用の関数がなかったので作成してみました。

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

int bin2dec(char *src);

int main(void)
{
    char binstr1[] = "1101";     /* 13 */
    char binstr2[] = "10110000";    /* 176 */
    char binstr3[] = "1000000100000000";    /* 33024 */

    int dec = 0;

    dec = bin2dec(binstr1);
    printf("%s:%d(0x%02.2X)\n", binstr1, dec, dec);

    dec = bin2dec(binstr2);
    printf("%s:%d(0x%02.2X)\n", binstr2, dec, dec);

    dec = bin2dec(binstr3);
    printf("%s:%d(0x%02.2X)\n", binstr3, dec, dec);

    return 0;
}

/* 2進数文字列を10進数に変換 */
/* 10000000 -> 128, 1000 -> 8, 1000000000000000 -> 32768 */
int bin2dec(char *src)
{
    int dec = 0;
    for (;;) {
        if (*src == '1') {
            dec |= 1;
        }
        src++;
        if (!*src) {
            break;
        }
        dec <<= 1;
    }
    return dec;
}

実行結果
$ ./bin2dec
1101:13(0x0D)
10110000:176(0xB0)
1000000100000000:33024(0x8100)

[2325] Posted by kagahiro at 2013/07/03 00:10:55
0 point | Link (1) | Trackback (0) | Comment (0)

C言語のstrncpy関数やmemcpy関数ではバイト単位の操作になるので、漢字、ひらがな、カタカナなどの全角文字を文字数で指定して部分文字列を取り出すことができません。 そこで半角英数も全角文字も1文字として部分文字列を取り出すことができる関数を作成します。

以下はそのコードです。[C言語]UTF-8でエンコードされた文字列の文字数を取得するコードと同様に、文字の1バイト目のビットの状態を調べることによってその文字が何バイト文字を判定しています。

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

char *substr_utf8(char *dest, char *src, int offset, int len);
int _bytesize(unsigned char code);


int main(void)
{
    char *testStr = "ABCDEFGあいうえおアイウエオ愛夢佐々木";
    char strBuf[256];

    memset(strBuf, 0sizeof strBuf);

    printf("substr_utf8($testStr, 0, 5) = %s\n", substr_utf8(strBuf, testStr, 05));
    printf("substr_utf8($testStr, 3, 3) = %s\n", substr_utf8(strBuf, testStr, 33));
    printf("substr_utf8($testStr, 10, 4) = %s\n", substr_utf8(strBuf, testStr, 104));
    printf("substr_utf8($testStr, 13, 5) = %s\n", substr_utf8(strBuf, testStr, 135));

    return 0;
}

/* UTF-8でエンコードされた文字列の部分文字列を取り出す */
/* substr_utf8 (文字列式, オフセット, 長さ)*/
char *substr_utf8(char *dest, char *src, int offset, int len)
{
    int srclen = strlen(src);
    int pos = 0;
    int count = 0;
    char *cp = dest;

    while (pos < srclen) {
        unsigned char code;
        code = *(src + pos); /* ASCIIコード値を取得 */
        int bytelen = _bytesize(code);

        if (count >= offset && count < (offset + len)) {
            memcpy(cp, (src + pos), bytelen);
            cp += bytelen;
            *cp = '\0';
        }
        pos += bytelen;
        count++; /* 文字数をカウント */
    }

    return dest;
}

/* 文字のバイト長を求める */
int _bytesize(unsigned char code)
{
    int size = 1;
    int i;

    if (0x80 & code) { /* 1バイト文字以外 */
        for (i = 2; i <= 8; i++) {
            code <<= 1;
            if (!(0x80 & code)) {
                break;
            }
            size++;
        }
    }
    return size;
}

実行結果
$ ./substr_utf8
substr_utf8($testStr, 0, 5) = ABCDE
substr_utf8($testStr, 3, 3) = DEF
substr_utf8($testStr, 10, 4) = えおアイ
substr_utf8($testStr, 13, 5) = イウエオ愛

[2324] Posted by kagahiro at 2013/07/02 11:02:48
0 point | Link (3) | Trackback (0) | Comment (0)

C言語のstrlen関数では文字列の長さとして返ってくる値はバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。

Webアプリケーションのテキスト処理ではそれでは不都合な場合もことも多いので、半角英数も全角文字(漢字、ひらがな、カタカナなど) も1文字としてカウントする関数を作成することにします。

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

int strlen_utf8(char *cp);
int _bytesize(unsigned char code);

int main(void)
{
    char *testAscii = "ABCDEFG";
    char *testHira  = "あいうえお";
    char *testKata  = "アイウエ";
    char *testKanji = "愛々木";
    char *testAll = "ABCDEFGあいうえおアイウエオ愛夢佐々木";

    printf("strlen(testAscii) = %d\n", strlen(testAscii));
    printf("strlen_utf8(testAscii) = %d\n", strlen_utf8(testAscii));

    printf("strlen(testHira) = %d\n", strlen(testHira));
    printf("strlen_utf8(testHira) = %d\n", strlen_utf8(testHira));

    printf("strlen(testKata) = %d\n", strlen(testKata));
    printf("strlen_utf8(testKata) = %d\n", strlen_utf8(testKata));

    printf("strlen(testKanji) = %d\n", strlen(testKanji));
    printf("strlen_utf8(testKanji) = %d\n", strlen_utf8(testKanji));

    printf("strlen(testAll) = %d\n", strlen(testAll));
    printf("strlen_utf8(testAll) = %d\n", strlen_utf8(testAll));

    return 0;
}

/* UTF-8でエンコードされた文字列の文字数を取得 */
int strlen_utf8(char *cp)
{
    int textlen = strlen(cp);
    int pos = 0;
    int count = 0;

    while (pos < textlen) {
        unsigned char code;
        code = *(cp + pos); /* ASCIIコード値を取得 */
        int bytelen = _bytesize(code);
        pos += bytelen;
        count++; /* 文字数をカウント */
    }

    return count;
}

/* 文字のバイト長を求める */
int _bytesize(unsigned char code)
{
    int size = 1;
    int i;

    if (0x80 & code) { /* 1バイト文字以外 */
        for (i = 2; i <= 8; i++) {
            code <<= 1;
            if (!(0x80 & code)) {
                break;
            }
            size++;
        }
    }
    return size;
}

strlen_utf8関数では、1バイト目のASCIIコード値をパラメータとして_bytesize関数を呼び出して文字のバイト数を求め、1文字分の処理を行うたびに文字数をカウントアップしています。

また、_bytesize関数ではパラメータで渡されたコード値の場合の文字のバイト数を、コード値のビットの状態から判定して戻り値として返しています。

プロクラムの実行結果は以下のようになります。

kagahiro@kagahiro-PC ~/sample/c
$ ./strlen_utf8
strlen(testAscii) = 7
strlen_utf8(testAscii) = 7
strlen(testHira) = 15
strlen_utf8(testHira) = 5
strlen(testKata) = 12
strlen_utf8(testKata) = 4
strlen(testKanji) = 9
strlen_utf8(testKanji) = 3
strlen(testAll) = 52
strlen_utf8(testAll) = 22

[2323] Posted by kagahiro at 2013/07/01 20:46:54
1 point | Link (3) | Trackback (0) | Comment (1)

TypeScript(タイプスクリプト)は、Webアプリケーションの開発に広く利用されているJavaScriptに、クラス(Class)やモジュール(Module)となどといった大規模開発に役立つ言語機能を追加したもので、コンパイルに...
[2317] Posted by kagahiro at 2013/06/24 16:47:58
0 point | Link (3) | Trackback (0) | Comment (0)

Google マップで、お店情報が古かったり、間違っている時に、ユーザーが正しいお店情報を Google に伝えることができる機能の提供が開始された。Google マップ検索した結果のお店情報が間違ってい場合は、「詳細を...
[2312] Posted by kagahiro at 2013/06/12 16:27:36
0 point | Link (1) | Trackback (0) | Comment (0)

掲示板サイト「CommentPP」で使用しているスレッド型掲示板システムを「CommentPP 1.0」をオープンソースライセンス(GPLv2)でリリースしました。CommentPP(コメントピーピー)1.0は、PHPとMySQL(データベース)で...
[2289] Posted by kagahiro at 2013/03/05 20:47:58
2 point | Link (2) | Trackback (0) | Comment (2)

PHPXMLを扱う場合、SimpleXMLやDOMを使うというのが一般的なようですが、今回はそれらは使わずに単に出力したいXML形式の文字列を生成してそれ出力するというサンプルコードです。サンプルコードの処理内容は、MyS...
[2286] Posted by kagahiro at 2013/02/21 20:19:18
0 point | Link (1) | Trackback (0) | Comment (0)

確かに、Webの開発をしているならプログラミングだけでなくデザイン系の情報もチャックしておく必要はありますね。Web業界にいると、常に新しい情報や技術が生まれるため、必要な知識の移り変わりが速いです。そこで...
[2275] Posted by kagahiro at 2013/02/18 10:14:14
0 point | Link (0) | Trackback (0) | Comment (0)

HTMLファイルのフォームからPerlのCGIでHTMLファイルを更新し、print?"Location:?HTMLファイルのURL",?"\n\n";でそのHTMLファイルを表示しても、更新前の古い状態で表示されてしまいます。だからといって、という記述...
[2270] Posted by kagahiro at 2013/02/15 13:47:02
1 point | Link (1) | Trackback (0) | Comment (1)

1バイト(8bit)の10進数を2進数の文字列に変換するコードのC言語版です。C言語では、PerlやPHPなどのように2進文字列に変換してくれる便利な関数は関数はないので、ビット演算子を使ってビットのオン・オフを判定して...
[2253] Posted by kagahiro at 2012/12/21 17:23:17
0 point | Link (6) | Trackback (0) | Comment (0)

|< 先頭へ  < 前へ  1 2 3 4 5  次へ >


アクセスランキング

今日のアクセスランキング TOP 10

  1. Google News (グーグルニュース)日本版 (2 PV)
  2. 日本地図(にほんちず) (1 PV)
  3. 「ロード・オブ・ザ・リング」 (1 PV)
  4. ライブドア上場廃止 (1 PV)
  5. 有力将棋系ユーチューバーのショウヤンさんが将棋ウォーズで「ソフト指し」を告白し衝撃走る (1 PV)

今月のアクセスランキング TOP 10

  1. Google News (グーグルニュース)日本版 (9 PV)
  2. 裁量トレードを半自動化する無料のMT5向け裁量トレード支援ツール(裁量補助EA)「PositionKeeper MT5」 #FX (7 PV)
  3. 2chまとめサイト - 痛いニュース(ノ∀`) (4 PV)
  4. 仲値トレードが簡単にできる無料EA「NAKANE3 Ver 2.04」 #MT4 (4 PV)
  5. 裁量トレードを自動化する裁量補助EA「AutoScalper Demo」 (3 PV)
  6. SQLのSELECT文で先頭から上位(TOP)10件のレコードを取得する方法(SQL Server、Oracle、MySQL、PostgreSQL) (3 PV)
  7. 2NN 2ちゃんねるニュース速報+ナビ (3 PV)
  8. [PR]noteで販売しているEAの使用期限を無期限にして価格を改定します。 (3 PV)
  9. 低レバレッジでドル円ロング、安全性最優先のMT4向けの無料EA「DOLLON(ドロン)」 (2 PV)
  10. キリ番トレードにも使える無料の半自動裁量支援ツール(EA)「PositionKeeper」 (2 PV)

アクセス統計

ディレクトリ

関連サイト