※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
空白その他除去
余分な空白その他を削除するもの。
void CharPress(char* str); //文字列の圧縮
int cutcrspace(char* str); //後ろの空白・改行文字削除
int cutcrspaceJ(char* str); //その日本語版
int cutprespaceJ(char* str); //先頭の空白除去(日本語空白対応)
int cutmemoetc(char* str); //後ろのコメント削除
void cutnonnum(char* str); //数字以外をカット
int PressMultiSpace(char* str); //連続した空白を1個にする
void CharPress(CString& str); //以下MFC版
CString& cutnonnum(CString& str);
CString& cutcrspace(CString &str);
CString& cutcrspaceJ(CString &str);
int cutprespaceJ(CString& str);
int PressMultiSpace(CString& str);
// 文字をできるだけ圧縮する
void CharPress(char* str)
{
static char tb1[]=
" 、。,.・:;?!゛゜\'` ^ _ o---/ | \'\'\"\"()[][]{"
"}<> 「」 +- x = <> ゜\'\" \\$ %#&*@ "; static char tb2[]=
"ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガキ ギク グ"
"ケ ゲコ ゴサ ザシ ジス ズセ ゼソ ゾタ ダ"
"チ ヂッ ツ ヅテ デト ドナ ニ ヌ ネ ノ ハ バ"
"パヒ ビピフ ブプヘ ベペホ ボポマ ミ "
"ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ワ ワ "
"ヰヱヲ ン ヴカ ケ ";
int i,j,k,m;
int slen = strlen(str);
//特殊文字,カタカナ,アルファベット,数字の圧縮
for (i=j=0; i<slen; )
{
k = str[i]; if (k<0) k+=256;
m = str[i+1]; if (m<0) m+=256;
if (k==129)
{
if (m<64 || m>151)
{
str[j++]=str[i++];
str[j++]=str[i++];
continue;
}
if (m==64) //漢字の空白
{
i+=2;
continue;
}
if (tb1[m-64]==32) //圧縮不能
{
str[j++]=str[i++];
str[j++]=str[i++];
continue;
}
str[j++] = tb1[m-64];
i+=2;
continue;
}
if (k==130)
{
if (79<=m && m<=88) //数字
{
str[j++] = m-31;
i+=2;
continue;
}
if (96<=m && m<=121) //アルファベット大
{
str[j++] = m-31;
i+=2;
continue;
}
if (129<=m && m<=154) //アルファベット大
{
str[j++] = m-32;
i+=2;
continue;
}
}
if (k==131 && 64<=m && m<=150) //カタカナ
{
memcpy(str+j, tb2+(m-64)*2, 2);
if (str[j+1]==32)
j++;
else
j+=2;
i+=2;
continue;
}
if ((129<=k && k<=159) || (224<=k && k<=254))
{
str[j++]=str[i++];
str[j++]=str[i++];
continue;
}
if (k==32)
i++;
else
str[j++]=str[i++];
}
str[j]=0;
}
/********************************************************************
* 右の空白と改行を除去する
*******************************************************************/
int cutcrspace(char* str)
{
int k;
k=strlen(str)-1;
while(k>=0 && (str[k]==' ' || str[k]==0x0d || str[k]==0x0a))
str[k--]=0;
return(k);
}
/********************************************************************
* 右の空白(含む漢字)と改行を除去する
*******************************************************************/
int cutcrspaceJ(char* str)
{
int i,k,m;
unsigned char c;
m=0;
for(i=0,k=-1; c=str[i]; i++)
{
if (c==0x20 || c==0x09)
continue;
if (c==0x0d || c==0x0a)
{
m=1;
continue;
}
if (c < 0x080 || (c>=0x0a0 && c<=0x0df))
{
k=i;
continue;
}
else
{
i++;
if (c==0x081 && str[i]==0x040)
continue;
k=i;
continue;
}
}
str[k+1]=0;
return(m);
}
/********************************************************************
左の空白(含む漢字)を除去する
*******************************************************************/
int cutprespaceJ(char* str)
{
int i,k,len,c1;
k = len = strlen(str);
for (i=0; i<len; i++)
{
c1=str[i]; if (c1<0) c1+=256;
if (c1==32)
continue;
if (c1==129 && str[i+1]==64)
{
i++;
continue;
}
k=i;
break;
}
if (0<k && k<len)
memmove(str, str+k, len-k);
str[len-k]=0;
return len-k;
}
/********************************************************************
右のコメントその他を除去する
*******************************************************************/
int cutmemoetc(char* str)
{
int i,k,len,c1;
len = strlen(str);
for (i=k=0; i<len; i++)
{
c1=str[i]; if (c1<0) c1+=256;
if (c1==13 || c1==10)
break;
if (c1=='/' && str[i+1]=='/')
break;
if (c1==32)
continue;
if (c1==129 && str[i+1]==64)
{
i++;
continue;
}
if ((129<=c1 && c1<=159)||(224<=c1))
i++;
k=i+1;
}
str[k]=0;
return(k);
}
/********************************************************************
数字以外を削除する
*******************************************************************/
void cutnonnum(char* str)
{
int i,j;
for (i=j=0; str[i]; i++)
{
if (48<=str[i] && str[i]<=57)
str[j++]=str[i];
}
str[j]=0;
return;
}
/********************************************************************
連続した空白を1個の空白に置換する
*******************************************************************/
int PressMultiSpace(char* str)
{
int i,j,m,len,c1;
len = strlen(str);
for (i=j=m=0; i<len; i++)
{
c1=str[i]; if (c1<0) c1+=256;
if (c1==32)
{
if (m)
continue;
str[j++]=str[i];
m=1;
continue;
}
if (c1==129 && str[i+1]==64)
{
if (m)
{
i++;
continue;
}
str[j++]=str[i++];
str[j++]=str[i];
m=1;
continue;
}
if ((129<=c1 && c1<=159) || (224<=c1))
{
str[j++]=str[i++];
str[j++]=str[i];
m=0;
}
else
{
str[j++]=str[i];
m=0;
}
}
str[j]=0;
return j;
}
void CharPress(CString& str)
{
int len = str.GetLength();
char* buf = str.GetBuffer(len+3);
buf[len]=0;
CharPress(buf);
str.ReleaseBuffer();
}
CString& cutcrspace(CString &str)
{
int len = str.GetLength();
char* buf = str.GetBuffer(len+3);
buf[len]=0;
cutcrspace(buf);
str.ReleaseBuffer();
return str;
}
CString& cutcrspaceJ(CString &str)
{
int len = str.GetLength();
char* buf = str.GetBuffer(len+3);
buf[len]=0;
cutcrspaceJ(buf);
str.ReleaseBuffer();
return str;
}
int cutprespaceJ(CString& str)
{
int len = str.GetLength();
char* buf = str.GetBuffer(len+3);
buf[len]=0;
cutprespaceJ(buf);
str.ReleaseBuffer();
return str.GetLength();
}
CString& cutnonnum(CString& str)
{
int len = str.GetLength();
char* buf = str.GetBuffer(len+3);
buf[len]=0;
cutnonnum(buf);
str.ReleaseBuffer();
return str;
}
/********************************************************************
連続した空白を1個の空白に置換する
*******************************************************************/
int PressMultiSpace(CString& str)
{
int len = str.GetLength();
char* buf = str.GetBuffer(len+1);
buf[len]=0;
len = PressMultiSpace(buf);
str.ReleaseBuffer();
return len;
}