「私はsuiです。私は猫が好きです。私設でかっています」
と言う文章があったとして、この文から漢字だけを抽出し、カウントするプログラムを作りたいのですが、なかなかうまくいきません。
出力希望
私:3
猫:1
設:1
このような感じで出力できるようになりたいのですが、なんとかならないでしょうか?
質問です
-
井上
Re: 質問です
// 適当ですがこんな感じでしょうか ↓↓?
#include <stdio.h>
#include <string.h>
// For Shift-JIS
// 漢字出現回数テーブル
#define KANJI_TABLE_MAX (100)
typedef struct {
char kanji[3]; // 漢字 2バイト + \0
int count; // 表示回数
} KANJI_TABLE;
static KANJI_TABLE kanji_table[ KANJI_TABLE_MAX ]; // グローバルで宣言したので0初期化
// 漢字チェック(適当)
int is_sjis_kanji( unsigned char c )
{
//http://www.seiai.ed.jp/sys/text/java/sh ... table.html
// 亜 <= c && c <= 滌 || 漾 <= c && c <= ?
if ( ( 0x88 <= c && c <= 0x9f ) || (0xe0 <= c && c <= 0xfc ) ) {
// 漢字
return 1;
}
return 0;
}
// 漢字テーブルに挿入
int insert_kanji( char* kanji )
{
for( int i = 0; i < KANJI_TABLE_MAX; i++ )
{
// 空きか登録済みか探す
KANJI_TABLE* p = &kanji_table[ i ];
if( p->count == 0 ) {
strcpy( p->kanji, kanji );
p->count = 1;
return 1;
}
else if( strcmp( p->kanji, kanji ) == 0) {
p->count ++;
return 1;
}
}
return 0;
}
// 漢字テーブルを表示
void print_kanji()
{
for( int i = 0; i < KANJI_TABLE_MAX; i++ )
{
// 空きか登録済みか探す
KANJI_TABLE* p = &kanji_table[ i ];
if( p->count == 0 )
break;
// 漢字 + 表示回数
printf("%s:%d\n", p->kanji, p->count );
}
}
int main(void)
{
char* str = "私はsuiです。私は猫が好きです。私設でかっています";
for( char*p = str; *p != '\0'; p++ ) {
// 漢字チェック!
if( is_sjis_kanji( *p ) ) {
char letter[ 3 ] = { 0 };
letter[ 0 ] = *(p+0);
letter[ 1 ] = *(p+1);
///printf("%s\n", letter );
// 漢字テーブルに登録!
insert_kanji( letter );
p++; // Shift-JISでは漢字は2バイトなので+1する
}
}
// 漢字テーブルを表示
print_kanji();
}
#include <stdio.h>
#include <string.h>
// For Shift-JIS
// 漢字出現回数テーブル
#define KANJI_TABLE_MAX (100)
typedef struct {
char kanji[3]; // 漢字 2バイト + \0
int count; // 表示回数
} KANJI_TABLE;
static KANJI_TABLE kanji_table[ KANJI_TABLE_MAX ]; // グローバルで宣言したので0初期化
// 漢字チェック(適当)
int is_sjis_kanji( unsigned char c )
{
//http://www.seiai.ed.jp/sys/text/java/sh ... table.html
// 亜 <= c && c <= 滌 || 漾 <= c && c <= ?
if ( ( 0x88 <= c && c <= 0x9f ) || (0xe0 <= c && c <= 0xfc ) ) {
// 漢字
return 1;
}
return 0;
}
// 漢字テーブルに挿入
int insert_kanji( char* kanji )
{
for( int i = 0; i < KANJI_TABLE_MAX; i++ )
{
// 空きか登録済みか探す
KANJI_TABLE* p = &kanji_table[ i ];
if( p->count == 0 ) {
strcpy( p->kanji, kanji );
p->count = 1;
return 1;
}
else if( strcmp( p->kanji, kanji ) == 0) {
p->count ++;
return 1;
}
}
return 0;
}
// 漢字テーブルを表示
void print_kanji()
{
for( int i = 0; i < KANJI_TABLE_MAX; i++ )
{
// 空きか登録済みか探す
KANJI_TABLE* p = &kanji_table[ i ];
if( p->count == 0 )
break;
// 漢字 + 表示回数
printf("%s:%d\n", p->kanji, p->count );
}
}
int main(void)
{
char* str = "私はsuiです。私は猫が好きです。私設でかっています";
for( char*p = str; *p != '\0'; p++ ) {
// 漢字チェック!
if( is_sjis_kanji( *p ) ) {
char letter[ 3 ] = { 0 };
letter[ 0 ] = *(p+0);
letter[ 1 ] = *(p+1);
///printf("%s\n", letter );
// 漢字テーブルに登録!
insert_kanji( letter );
p++; // Shift-JISでは漢字は2バイトなので+1する
}
}
// 漢字テーブルを表示
print_kanji();
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 質問です
井上さん、こちらは始めてですか?
回答していただくのはありがたいのですが、ぜひ、こちらのフォーラムルールをお読みください。
http://dixq.net/board/board.html
面倒だと思われるでしょうが、アドバイスをしていただけると助かります。
それと漢字コードがsui さんから提示されていないので、その方法で良いかはなんとも言えないのではないでしょうか?
回答していただくのはありがたいのですが、ぜひ、こちらのフォーラムルールをお読みください。
http://dixq.net/board/board.html
面倒だと思われるでしょうが、アドバイスをしていただけると助かります。
それと漢字コードがsui さんから提示されていないので、その方法で良いかはなんとも言えないのではないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。