|
|
ゲーム関連とプログラム言語。
バグ。
|
|
|
|
昨日の続き
Tuesday, May 30, 2006 1:11 AM
unsigned char string[3];
unsinged char型に、strcpy と strcmp でコピーと比較したいんだけど
なんでうまくいかないんだ。
_mbscmp と _mbscpy でもうまくできないのはなぜ。
unsigned char *buf;
_mbscmp( buf, string );
未熟ですみません
Monday, May 29, 2006 1:30 AM
せっかくここまできたので、
文章にでてきた全角文字の頻度の一番多いものがわかるプログラムに挑戦。
(あれ、そういえば、fgetcをunsigned char型で受け取ってるけどそれでいいのか)
#include <stdio.h> #include <conio.h> #include <assert.h> #include <mbstring.h>
int main(void) {
unsigned char buffer;
char string[3];
FILE *fp = fopen( "bunsyo.txt", "r");
assert ( fp != NULL );
buffer = fgetc(fp);
while( buffer != EOF ){ if( 1 == _mbsbtype( &buffer, 0) ){
fseek( fp, -1, SEEK_CUR ); fread( string, 2, 1, fp );
string[2] = '\0'; // *(string+2) = '\0';
printf( "%s,\n", string );
} buffer = fgetc(fp);
}
fclose( fp); _getch();
return 0;
}
・追記
↓はなんかマヌケな気がしますがなんとか動いてます、キャスト大丈夫なはず。
#include <conio.h> #include <assert.h> #include <mbstring.h>
int main(void) {
char string[3];
FILE *fp = fopen( "hiragana.txt", "r");
assert ( fp != NULL );
while( fread( string, 1, 1, fp ) ){
if( 1 == _mbsbtype( (unsigned char*)string, 0 ) ){
fseek( fp, -1, SEEK_CUR ); fread( string, 2, 1, fp );
// string[2] = '\0'; *(string+2) = '\0';
printf( "%s,\n", string );
}
}
fclose( fp); _getch();
return 0;
}
最初から、unsigned char string[3]にすればいいんだ。
まだまだ
Monday, May 29, 2006 12:49 AM
なんとか半角文字を飛ばすことができた。
でもなんか余計なものが「フ」ですか、freadがあやういですか、終端文字ですか。
#include <stdio.h> #include <conio.h> #include <assert.h> #include <mbstring.h>
int main(void) {
unsigned char buffer;
char string;
FILE *fp = fopen( "hiragana.txt", "r");
assert ( fp != NULL );
buffer = fgetc(fp);
while( buffer != EOF ){ if( 1 == _mbsbtype( &buffer, 0) ){
fseek( fp, -1, SEEK_CUR ); fread( &string, sizeof(char)*2, 1, fp );
printf( "%s, ", &string );
} buffer = fgetc(fp);
}
fclose( fp); _getch();
return 0;
}
・追記
なんこも、BLOGはやめよう、自分。
文字取り出すことに成功、でもなんで、string[2]でいいんだろう? string[3]ではなく。
#include <stdio.h> #include <conio.h> #include <assert.h> #include <mbstring.h>
int main(void) {
unsigned char buffer;
char string[2];
FILE *fp = fopen( "hiragana.txt", "r");
assert ( fp != NULL );
buffer = fgetc(fp);
while( buffer != EOF ){ if( 1 == _mbsbtype( &buffer, 0) ){
fseek( fp, -1, SEEK_CUR ); fread( string, sizeof(char)*2, 1, fp );
string[2] = '\0';
printf( "%s,\n ", string );
} buffer = fgetc(fp);
}
fclose( fp); _getch();
return 0;
}
こんどはエラーか
Sunday, May 28, 2006 11:48 PM
#include <stdio.h> #include <conio.h> #include <assert.h> #include <mbstring.h>
int main(void) {
int buffer;
FILE *fp = fopen( "hiragana.txt", "r");
assert ( fp != NULL );
buffer = fgetc(fp);
while( buffer != EOF ){ if( 1 == _mbsbtype( (unsigned char *)buffer, 0) ){
fseek( fp, -1, SEEK_CUR );
fread( (void *)buffer, sizeof(char)*2, 1, fp );
printf( "%s,", buffer );
}
buffer = fgetc(fp);
}
fclose( fp); _getch();
return 0;
}
やっぱりダメか
Sunday, May 28, 2006 11:21 PM
うーん、さっぱりわかりませんです。 何も表示されないですが。
#include <stdio.h> #include <conio.h> #include <assert.h> #include <mbstring.h>
int main(void) {
unsigned char buffer;
char *string;
FILE *fp = fopen( "hiragana.txt", "r");
assert ( fp != NULL );
buffer = fgetc(fp);
while( buffer != EOF ){ if( 1 == ( (const unsigned char &)buffer, 0) ){
fseek( fp, -1, SEEK_CUR ); fread( string, sizeof(char)*2, 1, fp );
printf( "%s, ", string );
} buffer = fgetc(fp);
}
fclose( fp); _getch();
return 0;
}
うーわかんない
Saturday, May 27, 2006 9:04 PM
C、C++で、全角文字(ひらがなとか)を判断する関数ないのかなー。
文章から、全角文字とりだすのはどうやってやればいいんだろ。
sizeof(stirng)で配列全体の大きさがわかるんだ。 ポインタの配列は大体わかったかな。
#include <stdio.h>
int main(void) {
char *string[] = { "ONE", "TWO", "THREE", "FOUR", "FIVE" };
int num = 0;
for( num = 0; num < sizeof(string)/sizeof(stirng[0]); num++ ){
printf( "%d:%s", num, string[num] );
}
return 0;
}
たしただけ
Saturday, April 08, 2006 6:38 AM
いろいろな項目足してみました。
asiato.txt
512 4/7 23:00 stray lame 511 4/7 22:23 スポケ タロウ 510 4/7 22:12 student
・ ・ ・
2 1/2 3:24 BLINXS 1 1/1 2:43 MASTER
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>
#define K 513
//それぞれのキーワードと数を保持 struct record {
char keyword[30];
int count;
};
struct footprint {
int number;
char day[30];
char time[30];
char name[30];
int count;
};
//比較関数 int compare( const void *a, const void *b ) {
return strcmp( *( const char** )a, *( const char** )b );
}
//文字列の最後の\nを\0に置き換える char* erase_cr( char* str ) {
char* pos;
while ( ( pos = strchr( str, '\n' ) ) != NULL ) *pos = '\0';
return str;
}
//構造体のアドレスをとってきて、文字列の配列とkeyを比べて同じだったらそのアドレスを返す。 struct footprint* find_keyword( struct footprint* track, int size, const char* key ) {
int i;
for ( i = 0; i < size; ++i ) {
if ( strcmp(track[i].name, key) == 0 ) {
return &track[i];
} } return NULL;
}
int main(void) {
struct record hist[K];
struct footprint track[K];
int size; //キーワードの種類数
int kind = 0;
FILE* fp;
char *data[K] ={ 0 };
char buffer[30];
int num = 0;
char d[30];
char t[30];
char na[30];
int i;
fp = fopen( "Asiato.txt", "r" );
assert ( fp != NULL );
fscanf( fp, "%d %s %s ", &num, d, t );
//構造体に文字列を1つ1つ登録 // for ( size = 0; fgets( buffer, 20, fp ) != NULL; size++ ) { // for( size = 0; fscanf( fp, "%d %s %s %s", &num, d, t, na ) != EOF; size++ ) { for ( size = 0; fgets( na, 30, fp ) != NULL; size++ ) {
//← strcpy( track[size].name, erase_cr(na) );
track[size].count = 0;
fscanf( fp, "%d %s %s ", &num, d, t );
}
fclose(fp);
////////でたらめ文字列登録/////////
for( i = 0; i < K - 1; i++ ) data[i] = track[i].name;
///////////////////////////////////
qsort( data, K - 1, sizeof(*data), compare );
//////////////そろえおわった/////////////
for ( i = 0; i < K - 1; i++ ) {
if ( strcmp( data[kind], data[i] ) ) {
data[++kind] = data[i]; }
}
fp = fopen( "Kind.txt", "w" );
assert ( fp != NULL );
for( i = 0; i < kind + 1; i++ ) {
fprintf( fp, "%s\n", data[i] );
}
fclose(fp);
/////////////////種類もだした////////////////
fp = fopen( "Kind.txt", "r");
assert ( fp != NULL );
//構造体に文字列を1つ1つ登録 for ( size = 0; fgets(buffer, 30, fp) != NULL; ++size ) { // for( size = 0; fscanf( fp, "%d %s %s %s", number, day, time, name ) != EOF; size++ ) { //← strcpy( track[size].name, erase_cr(buffer) );
track[size].count = 0;
}
fclose(fp); ////////////////////種類取得/////////////////
fp = fopen( "Asiato.txt", "r" );
assert ( fp != NULL );
fscanf( fp, "%d %s %s ", &num, d, t );
// while ( fgets(buffer, 20, fp ) != NULL ) { // while ( fscanf( fp, "%d %s %s %s", &num, d, t, na ) != EOF ) { while ( fgets( na, 30, fp ) != NULL ) {
struct footprint* found = find_keyword( track, size, erase_cr(na) );
//キーワードと同じ文字列があればカウントアップ if ( found != 0 ) { ++found->count;
}
fscanf( fp, "%d %s %s ", &num, d, t );
} fclose(fp);
fp = fopen( "Count.txt", "w" );
assert ( fp != NULL );
for ( i = 0; i < size; ++i ) {
fprintf( fp, "%-20s %2d\n", track[i].name, track[i].count );
} fclose(fp);
return 0;
}
まとめてみました
Saturday, April 08, 2006 2:34 AM
ただ、まえまえからやってるやつをまとめただけ。
いがいにどうにかなるものだ。
おかしいところ直さねば。
Original.txt
C++ OpenGL Java C++ Perl C++ Assembler DirectX C++ DirectX C HTML C Java Visual C++ CGI C
↓
Kind.txt
Assembler C C++ CGI DirectX HTML Java OpenGL Perl Visual C++
Count.txt
Assembler 1 C 3 C++ 4 CGI 1 DirectX 2 HTML 1 Java 2 OpenGL 1 Perl 1 Visual C++ 1
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h>
#define K 18
//それぞれのキーワードと数を保持 struct record {
char keyword[20];
int count;
};
//比較関数 int compare( const void *a, const void *b ) {
return strcmp( *( const char** )a, *( const char** )b );
}
//文字列の最後の\nを\0に置き換える char* erase_cr( char* str ) {
char* pos;
while ( ( pos = strchr( str, '\n' ) ) != NULL ) *pos = '\0';
return str;
}
//構造体のアドレスをとってきて、文字列の配列とkeyを比べて同じだったらそのアドレスを返す。 struct record* find_keyword( struct record* rec, int size, const char* key ) {
int i;
for ( i = 0; i < size; ++i ) {
if ( strcmp(rec[i].keyword, key) == 0 ) {
return &rec[i];
} } return NULL;
}
int main(void) {
struct record hist[K];
int size; //キーワードの種類数
int kind = 0;
FILE* fp;
char *data[K] ={ 0 };
char buffer[20];
int i;
fp = fopen( "Original.txt", "r" );
assert ( fp != NULL );
//構造体に文字列を1つ1つ登録 for ( size = 0; fgets( buffer, 20, fp ) != NULL; size++ ) { //← strcpy( hist[size].keyword, erase_cr(buffer) );
hist[size].count = 0;
}
fclose(fp);
////////でたらめ文字列登録/////////
for( i = 0; i < K - 1; i++ ) data[i] = hist[i].keyword;
///////////////////////////////////
qsort( data, K - 1, sizeof(*data), compare );
/* for ( i = 0; i < size - 2; ++i ) {
printf( "%-15s %2d\n", data[i], hist[i].count );
} */
//////////////そろえおわった/////////////
for ( i = 0; i < K - 1; i++ ) {
if ( strcmp( data[kind], data[i] ) ) {
data[++kind] = data[i]; // for( j = 0; j < N; j++ ) printf( "%s\n", data[j] );
// printf("\n"); }
}
fp = fopen( "Kind.txt", "w" );
assert ( fp != NULL );
for( i = 0; i < kind; i++ ) {
printf( "%s\n", data[i] );
fprintf( fp, "%s\n", data[i] );
}
fclose(fp);
/////////////////種類もだした////////////////
fp = fopen( "Kind.txt", "r");
assert ( fp != NULL );
//構造体に文字列を1つ1つ登録 for ( size = 0; fgets(buffer, 20, fp) != NULL; ++size ) { //← strcpy(hist[size].keyword, erase_cr(buffer));
hist[size].count = 0;
}
fclose(fp); ////////////////////種類取得/////////////////
fp = fopen( "program.txt", "r" );
assert ( fp != NULL );
while ( fgets(buffer, 20, fp ) != NULL ) {
struct record* found = find_keyword( hist, size, erase_cr(buffer) );
//キーワードと同じ文字列があればカウントアップ if ( found != 0 ) { ++found->count;
}
} fclose(fp);
fp = fopen( "Count.txt", "w" );
assert ( fp != NULL );
for ( i = 0; i < size; ++i ) {
fprintf( fp, "%-15s %2d\n", hist[i].keyword, hist[i].count );
} fclose(fp);
return 0;
}
ほとんど、俺作ってないじゃん。
ポインタの理解がまだまだだし。
読み込んで読み込んで…
Sunday, April 02, 2006 11:08 AM
テキストファイルを2つ読み込んで1個1個の数を数える。
ここまでくるとさらにマヌケ。
original.txt
Assembler C C C C++ C++ C++ C++ CGI DirectX DirectX HTML Java Java OpenGL Perl Visual C++
kind.txt
Assembler C C++ CGI DirectX HTML Java OpenGL Perl Visual C++
#include <stdio.h> #include <string.h>
#define O 18 #define K 11
int main(void) {
int o_len, k_len; int i = 0, j = 0;
int num_data[K];
char o_buf[20], k_buf[20];
char *o_data[O], *k_data[20]; FILE *fp, *gp, *hp;
fp = fopen( "original.txt", "r" );
if( fp == NULL ) return 1;
gp = fopen( "kind.txt", "r" );
if( gp == NULL ) return 1;
hp = fopen( "count.txt", "w" );
if( hp == NULL ) return 1;
for( i = 0; i < K - 1; i++ ) num_data[i] = 0;
i = 0;
while(1) {
fgets( o_buf, 20, fp );
o_len = strlen( o_buf );
if( o_buf[o_len - 1] == '\n' ) o_buf[--o_len] = '\0';
o_data[i] = ( char * )malloc(o_len + 1);
strcpy( o_data[i], o_buf );
if( feof(fp) ) break;
// printf( "%s\n", buf );
i++;
}
i = 0;
while(1) {
fgets( k_buf, 20, gp );
k_len = strlen( k_buf );
if( k_buf[k_len - 1] == '\n' ) k_buf[--k_len] = '\0';
k_data[i] = ( char * )malloc(k_len + 1);
strcpy( k_data[i], k_buf );
if( feof(gp) ) break;
// printf( "%s\n", buf );
i++;
}
for( i = 0; i < O - 1; i++ ){
for ( j = 0; j < K -1; j++ ) { if ( strcmp( o_data[i], k_data[j] ) == 0 ) { num_data[j]++;
}
}
}
for( i = 0; i < K - 1; i++ ){
// printf( "%s:%d\n", k_data[i], num_data[i] ); fprintf( hp, "%s:%d\n", k_data[i], num_data[i] ); }
for( i = 0; i < O - 1; i++ ) {
// printf( "%s\n", data[i] ); // fprintf( fp, "%s\n", data[i] ); free( o_data[i] ); }
for( i = 0; i < K - 1; i++ ) {
// printf( "%s\n", data[i] ); // fprintf( gp, "%s\n", data[i] ); free( k_data[i] ); }
fclose(fp);
fclose(gp);
fclose(hp);
return 0;
}
|
|
|
|
|
|
| | Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| 30 | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 10 | 11 | | | | |