LoginSignup
2
0

More than 3 years have passed since last update.

C言語で全角カタカナを判定する

Last updated at Posted at 2020-05-23

いきさつ

コンソールで全角カタカナのみを入力させたいということで作りました。
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;
}
出力結果
アドビイラストレーター
カタカナ以外が含まれています。
2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0