|
こんにちわ。C 言語の開発歴1 年のかおりといいます。よろしくお願いします。
C 言語を使った汎用性のある文字コード変換プログラムを書いていますが、いまいち使い方が分かりません。ウェブ上のMAN マニュアルを見ても難しくて理解に困っています。
次のプログラムは配列 inbuff 配列に記載された日本語EUC 文字をJIS に変換してoutbuff 領域に書き出す処理なのですが、なぜ動かないのか教えてくれると幸いです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>
char errmsg[1024]; // エラーメッセージ
int main( int argc, char **argv ) {
size_t status; // ステータス
char *inbuffp; // 変換前データへのポインタ
char *outbuffp; // 変換後データへのポインタ
char inbuff[INBUFFSIZE]; // 変換前データ領域
size_t inbyte; // 変換前データ長
size_t outbyte; // 変換後データ長
iconv_t cd; // コード変換用ディスクプリタ
// 変数を初期化する
status = 1;
errmsg[0] = '?0';
inbuffp = NULL;
outbuffp = NULL;
inbuff[0] = '?0';
inbyte = 0;
outbyte = 0;
cd = 0;
// 変換する文字列を作成する
strcpy( inbuff, "てすと" );
// ● EUC → JIS 変換を行う
// コード変換前データ領域を作成する
inbuffp = inbuff;
inbyte = strlen( inbuffp );
outbuffp = (char *)malloc( sizeof(char)*(inbyte+1024));
memset( outbuffp, '?0', sizeof(outbuffp) );
outbyte = inbyte+1024;
// コード変換用ディスクリプタを開く
cd = iconv_open( "ISO-2022-JP", "EUC-JP" );
if( cd == (iconv_t)-1 ) {
sprintf( errmsg, "エラーが発生しました。" );
return -1;
}
printf( "EUC データ:%s ", inbuffp );
// コード変換を行う
status = iconv( cd, (const char **)&inbuffp, &inbyte, &outbuffp, &outbyte );
if( status == (size_t)-1 ) {
sprintf( errmsg, "エラーが発生しました。" );
return -1;
}
printf( "JIS データ:%s ", outbuffp );
// コード変換用ディスクプリタを閉じる
iconv_close( cd );
// コード変換後データ領域を解放する
free( outbuffp );
printf( "正常終了しました。" );
return 1;
}
コンパイル時に警告は出ますが、make は正常に行われます。上記で、出力する領域をmalloc で確保していますが、これが問題と思っています。なぜ問題かがわかりません。
お願いします。
|