見出し画像

C言語教室 第10回 文字種判定 答案提出

今回も考えてみました。

コード

#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* 英小文字を英大文字に書き換える */
void to_strupper(char str[])
{
    int len = strlen(str);
    int i;

    for (i = 0; i < len; i++)
    {
        str[i] = toupper(str[i]);
    }
}

/* 表示文字以外を”\x”で始まる16進コードの文字列に変換する */
void char_to_str(char s[], char c)
{
    if (isgraph(c))
    {
        s[0] = c;
    }
    else
    {
        sprintf(s, "\\x%02x", c);
    }
}

void ctrl_to_str(char dst[], char src[])
{
    int len = strlen(src);
    int i = 0;

    for (i = 0; i < len; i++)
    {
        char s[8] = {0};
        char_to_str(s, src[i]);
        strcat(dst, s);
    }
}

int main()
{
    {
        char name[] = "Ayumi Katayama@note";
        to_strupper(name);
        printf("%s\n", name);
    }

    {
        char data[0x80];
        char str[0x201];
        int i;

        for (i = 1; i < sizeof(data); i++)
        {
            data[i-1] = i;
        }
                                                                      ctrl_to_str(str, data);
        printf("%s\n", str);
    }

    return 0;
}

実行結果

AYUMI KATAYAMA@NOTE
\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f

後書き

const だとか、引数チェックだとかはパスしました。こういうものを入れると肝心なものが見えにくくなって困ります。製品コードであれば検討は必須なんですけど。

16進数文字列は、0x80 以上になると困ることになるかもしれない。文字列が「0xffffff80」になっちゃったり。4文字限定のサイズしか確保していないので、こんな変換されちゃうとオーバーランしてしまいます。「(unsigned int)(unsigned char)」でキャストすればいいかもしれないけど、また、長い! ですので、「0x01~0x7f」に限定したコードです。ほんっとにC言語ってオーバーランコードがホイホイ書けてしまふ。


この記事が気に入ったらサポートをしてみませんか?