16 進 HTML/CSS カラーコードの10進RGBへの変換

ソースコードを公開してみんなにつっこんでもらおう!
という主旨のグループです。
返信
アバター
みけCAT
記事: 6227
登録日時: 9年前
住所: 千葉県
連絡を取る:

16 進 HTML/CSS カラーコードの10進RGBへの変換

#1

投稿記事 by みけCAT » 8年前

日記の方にも書いたコードですが、レビューをお願いします。

コード:

#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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

記事: 26
登録日時: 9年前
住所: 新潟

Re: 16 進 HTML/CSS カラーコードの10進RGBへの変換

#2

投稿記事 by » 8年前

好みの問題かとも思うのですが、

コード:

/*長さチェック*/
    if(len!=4 && len!=7)return 0;
    /*先頭の文字チェック*/
    if(code[0]!='#')return 0;
の部分はそれぞれの条件違反ごとに戻り値を変えるかメッセージを表示するわけでなければ

コード:

if((len != 4 && len != 7) || code[0] != '#')
return 0;
と書くほうがすっきりするような気がします。

返信

“みんなでソースコードをレビューしよう” へ戻る