最近の Linux なら locale は ja_JP.UTF-8 でイケるようだ。
scanf – Wikipedia
scanf ってこんなに面倒だったかなぁ…
gets だと思いっきり警告だし。
wchar_t って Linux では 4 バイトなんだね。
Windows つか Visual Studio では 2 バイトなのですけど。
最近の Windows SDK のようにセキュリティ関数が存在してくれないと怖いなぁ…
文字列処理って簡単にバッファオーバーランが起こせるからね。
malloc で動的処理すればなんとかなりそうだけど std::string のほうが(略
日本語の文字数カウントとかをするには UNICODE にするのが一番なわけで。
とりあえずバッファオーバーラン等を考慮しないでうまくいったコード。
#include <stdio.h>
#include <stddef.h>
#include <locale.h>
#include <string.h>
int
main (int argc, char *argv[])
{
/* set locale */
setlocale( LC_CTYPE, "ja_JP.UTF-8" );
/* おまけ、変数バイト数チェック */
printf("int サイズ = %d\n", sizeof(int));
printf("char サイズ = %d\n", sizeof(char));
printf("wchar_t サイズ = %d\n", sizeof(wchar_t));
/* バッファ */
char cin[256];
wchar_t s[256 * 4];
char c[4] = {0};
/* 何か入力させる */
printf("何か文字列を入力して Enter\n");
scanf("%s", cin);
/* UNICODE に変換 */
const char *cc = cin;
size_t t = mbsrtowcs(s, &cc, strlen(cc), NULL);
printf("文字数は %d です\n", t);
/* 一文字ずつ書き出ししてみる */
int i=0;
for (i; i<t; i++)
{
wctomb(c, s[i]);
printf("%s\n", c);
}
return 0;
}
あーくそ!Python ならたったコレだけ、import も無しで同じことができるんだが。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
s = raw_input("何か文字列を入力して Enter\n")
u = unicode(s, "utf8")
print "文字数は %d です" % len(u)
for c in u:
print c.encode("utf8")
しかもバッファオーバーランの心配は無いと思うし。
※追記、GLib を使えば簡単だった
gunichar | PaePoi









