#include <stdio.h>
#include <ctype.h>
#include <string.h>
/*16進数の文字1文字から数値に変換する*/
int hex2num(char hex) {
if(hex>='0' && hex<='9')return hex-'0';
if(hex>='A' && hex<='F')return hex-'A'+10;
if(hex>='a' && hex<='f')return hex-'a'+10;
return 0;
}
/*HTMLカラーコードから色に変換する*/
int colhenkan(int* red,int* green,int* blue,const char* code) {
int i;
int len;
/*長さを調べる*/
len=strlen(code);
/*長さチェック*/
if(len!=4 && len!=7)return 0;
/*先頭の文字チェック*/
if(code[0]!='#')return 0;
/*文字チェック*/
for(i=1;i<len;i++) {
if(!isxdigit(code[i]))return 0;
}
/*変換*/
if(len==4) {
/* #FFF のような形式 */
*red=hex2num(code[1])*17;
*green=hex2num(code[2])*17;
*blue=hex2num(code[3])*17;
} else {
/* #FFFFFF のような形式 */
*red=hex2num(code[1])*16+hex2num(code[2]);
*green=hex2num(code[3])*16+hex2num(code[4]);
*blue=hex2num(code[5])*16+hex2num(code[6]);
}
return 1;
}
/*改行を付けずに標準入力から一行読み込む*/
char* readline(char *buf,int bufsize) {
char* kai;
/*読み込めなかったらNULLを返す*/
if(!fgets(buf,bufsize,stdin))return NULL;
/*改行の位置を調べる*/
kai=strchr(buf,'\n');
/*改行があれば消す*/
if(kai)*kai=0;
/*fgetsに合わせる*/
return buf;
}
/*メイン関数*/
int main(void) {
char input[1000];
int red,green,blue;
/*読み込める間*/
while(readline(input,sizeof(input))) {
/*変換できたら*/
if(colhenkan(&red,&green,&blue,input)) {
/*結果を出力する*/
printf("%d,%d,%d\n",red,green,blue);
} else {
/*エラー*/
puts("error");
}
}
/*正常終了*/
return 0;
}
16 進 HTML/CSS カラーコードの10進RGBへの変換
16 進 HTML/CSS カラーコードの10進RGBへの変換
日記の方にも書いたコードですが、レビューをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)