![見出し画像](https://assets.st-note.com/production/uploads/images/95141460/rectangle_large_type_2_1157efefb37fc1cdb4bafc6c09d01f69.png?width=800)
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言語ってオーバーランコードがホイホイ書けてしまふ。
この記事が気に入ったらサポートをしてみませんか?