Profile

ys2310

Author:ys2310
2008年春にNew York Cityにあるふる〜い大学を卒業。


Categories


new postings


new comments


new trackbacks


monthly archeive


FC2ブログ 転職
DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
| BLOG TOP |
DATE: CATEGORY:C/C++ ctype.h
大文字小文字変換関数
toupper
ヘッダ #include "ctype.h"
形 式 int toupper(int c);
機 能 toupper関数は、英大文字を対応する英小文字に変換する。
返却値 実引数がislower関数に対して真となる文字であり、かつisupper関数が真となる対応する文字がある場合、toupper関数はその対応する文字を返す。そうでない場合、その実引数を変換せずにそのまま返す。

通常、to〜系関数は、

int tolower(int c)
{
return isupper(c) ? c - 'A' + 'a' : c;
}


のように実装されるのですが、この方法には問題があります。英文字の連続性については、文字コードを特定することで回避できますが、"C"ロケール以外をにらんだ場合、例えばドイツ語のß(エスツェット)は小文字しかないため、対応する大文字が存在しません。日本語の半角カナも類似の問題があります。

そこで、to〜関数もis〜関数のように表引きの手法をとることにします。
const unsigned char __toupper_C[257] = { ... };

たとえば、ASCII で'a' は97で、'A'は65なので、

__toupper_C[97] = 65;   のようctype.hで予め定義しておく。

よって、最終的には
static __inline__ int toupper(int c)
{
#ifdef __ONLY_C_LOCALE
return islower(c) ? c - 'a' + 'A' : c;
#else
return __toupper[c];
#endif
}


[Quote]:http://www.bohyoh.com/CandCPP/C/Library/toupper.html
http://libc.blog47.fc2.com/blog-entry-27.html

| BLOG TOP |
DATE: CATEGORY:C/C++ ctype.h
文字種テスト関数
isspace
#include "ctype.h"
int isspace(int c);
isspace関数は、標準の空白類文字のいずれかの文字またはisalnumが偽となる処理系定義の文字集合の一つの文字かどうかを判定する。標準の空白類文字は、空白(' ')、書式送り('\f')、改行('\n')、復帰('\r')、水平タブ('\t')および垂直タブ('\v')とする。"C"ロケールでは、isspaceは、標準の空白類文字に対してだけ真を返す。
判定が成立すれば0以外の値(真)を返し、成立しなければ0を返す。

■実装例■
static __inline__ int isspace(int c)
{
return __ctype[c] & _SPACE;
}

[Quote]:http://bohyoh.com
http://libc.blog47.fc2.com/blog-entry-26.html

| BLOG TOP |
DATE: CATEGORY:C/C++ ctype.h
文字種テスト関数
isalpha
ヘッダ #include "ctype.h"
形 式 int isalpha(int c);
機 能 isalpha関数は、isupperもしくはislowerが真となる文字かどうか、またはiscntrl、isdigit、ispunctもしくはisspaceのどれもが真とならない処理系定義の文字集合の一つの文字かどうかを判定する。"C"ロケールでは、isalphaは、isupperまたはislowerが真となる文字に対してだけ真を返す。
返却値 判定が成立すれば0以外の値(真)を返し、成立しなければ0を返す。

■実装例■
static __inline__ int isalpha(int c)
{
return __ctype[c] & (_LOWER|_UPPER);
}

ctype.h ヘッダーの中で定義しておくべきことは

#define _CNTRL 0x01
#define _LOWER 0x02
#define _UPPER 0x04
#define _DIGIT 0x08
#define _PUNCT 0x10
#define _SPACE 0x20
#define _BLANK 0x40
#define _XDIGIT 0x80
...



const unsigned char __ctype_C[257] = { ... };

たとえば、ASCII codeの97は'a' ですので、__ctype_C[97] = 0x02
などとここで定義しておくのです。

[Quote]:http://bohyoh.com
http://libc.blog47.fc2.com/blog-entry-23.html

| BLOG TOP |

copyright © Manhattan life all rights reserved.Powered by FC2ブログ