#いきさつ
コンソールで全角カタカナのみを入力させたいということで作りました。
Shift-JISの文字に対応しています。
要件
- ひらがなは全角カタカナに変換される
- スペースは削除する
- ひらがな、全角カタカナ以外の入力はお断りする
※コンパイラにより上手く動作しない可能性があります。
(2バイト文字の格納方法やエンディアンの関係上)
2020/5/24 18:45 修正しました
#コード
main.c
#include <stdio.h>
#include <string.h>
/***********************************************************************************/
/*@fn : isKatakana */
/*@brief : 文字列の全角カタカナ評価 */
/*@param : str[] 対象文字列 */
/*@return: str[]が、ひらがな、全角カタカナ、長音記号(ー)のみの文字列の時: 1 それ以外: 0 */
/*@detail: 文字列の中にひらがながあれば、全角カタカナに変換。スペースは消滅する */
/***********************************************************************************/
int isKatakana(char str[])
{
int i, j;
unsigned short* ptr;
//半角、全角スペースを消す
for (i = 0; i < strlen(str); i++) {
//半角スペース削除
if (str[i] == 0x20) {
for (j = i; j < strlen(str); j++) {
str[j] = str[j + 1];
}
i--;
}
//全角スペース削除
if (((unsigned char)str[i] == 0x81) && ((unsigned char)str[i + 1] == 0x40)) {
for (j = i; j < strlen(str) - 1; j++) {
str[j] = str[j + 2];
}
i--;
}
}
//ひらがなをカタカナに変換する
for (ptr = (unsigned short*)str; ptr < (unsigned short*)(str)+strlen(str); ptr++) {
unsigned short value; //2バイト文字の比較用
char* ch = (char*)ptr;
if (*ch == 0) break;
//リトルエンディアンをビッグエンディアンに直す(環境によって変更してください)
value = (unsigned short)*ch << 8;
value += (unsigned short)*(ch + 1) & 0xff;
//全角ひらがなだったら全角カタカナに変換する
if (value >= (unsigned short)0x829f && value <= (unsigned short)0x82f1) {
value += 0xA1;
if (value >= (unsigned short)0x837f && value <= (unsigned short)0x8395) {
value += (unsigned short)0x1;
}
}
//全角カタカナ以外の文字が含まれていないかチェック
if ((value != (unsigned short)0x815b) && (value < 0x8340 || value > 0x8396)) {
return 0;
}
//文字列に再格納(環境によって変更してください)
*ch = value >> 8;
*(ch + 1) = (char)value;
}
return 1;
}
int main(void){
char str1[50] = "あどび イラスト れーたー";
char str2[50] = "ツイtter";
if(isKatakana(str1) == 0) printf("カタカナ以外が含まれています。\n");
else printf("%s\n", str1);
if(isKatakana(str2) == 0) printf("カタカナ以外が含まれています。\n");
else printf("%s\n", str2);
return 0;
}
出力結果
アドビイラストレーター
カタカナ以外が含まれています。