blog/content/post/2009/05/13/2009-05-13-00001153.md

183 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 16進数を10進数に変換する関数の作成
author: kazu634
date: 2009-05-13
wordtwit_post_info:
- 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";s:1:"1";s:5:"delay";s:1:"0";s:7:"enabled";s:1:"1";s:10:"separation";i:60;s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4591;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- C
---
<div class="section">
<p>
<a href="http://d.hatena.ne.jp/sirocco634/20090512/1242140262" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090512/1242140262', '前回');" target="_blank">前回</a>の続きです。
</p>
<p>
前回は19までの数字しか対応させていなかったので、afも対応させるように修正させました。getdigitという関数を書いて、19, afまでを引数として受け取り、10進数を返すようにしてみました:
</p>
<pre class="lang:default decode:true ">#include &lt;stdio.h&gt;
/* === prototype declarations === */
/* htoi: 16進数を10進数に変換する */
void htoi(char hex[]);
/* count: char型の配列の要素数をカウントする。*/
int count(char hex[]);
/* getdigit: 16進数の1桁(char型(19, AF))を引数とし、10進数を返す */
int getdigit(char num);
/* === Main Part === */
int main(int argc, char *argv[]) {
htoi(argv[1]);
return 0;
}
void htoi(char hex[])
{
int i;
int n = 0;
for (i = (count(hex) - 1); i != -1; i--)
{
if (i == (count(hex) - 1)){
printf("n = %d + %d\n", n, getdigit(hex[i]));
n = n + getdigit(hex[i]);
} else {
printf("n = %d + (16 * %d)\n", n, getdigit(hex[i]));
n = n + (16 * getdigit(hex[i]));
}
}
printf("%d\n", n);
}
int count(char hex[])
{
int i;
int num = 0;
for (i = 0; hex[i] != '\0'; ++i)
{
num++;
}
return num;
}
int getdigit(char num)
{
switch(num) {
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'a':
return 10;
case 'b':
return 11;
case 'c':
return 12;
case 'd':
return 13;
case 'e':
return 14;
case 'f':
return 15;
default:
return 99;
}
}
</pre>
<h4>
疑問の答え
</h4>
<p>
こんな質問を書いていたら、maqさんから回答をいただきました:
</p>
<blockquote title="武蔵の日記" cite="http://d.hatena.ne.jp/sirocco634/">
<p>
maqmaq 2009/05/13 00:16 argv[1]の要素数を知ろうとして「sizeof argv[1] / sizeof argv[1][0]」が必ず4になるのはなぜ
</p>
<p>
sizeof(argv[1])はポインタのサイズが求まります。一般的なマシンなら32bitで4ですね。
</p>
<p>
sizeof(argv[1][0])はcharのサイズが求まります。これは8bitで1ですね。
</p>
<p>
なので4/1で4になるのではないでしょうか。
</p>
<p>
<cite><a href="http://d.hatena.ne.jp/sirocco634/" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/', '武蔵の日記');" target="_blank">武蔵の日記</a></cite>
</p>
</blockquote>
<p>
納得できました。ありがとうございますmaqさん
</p>
<h4>
「[<a href="http://d.hatena.ne.jp/asin/4320026926" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4320026926', 'プログラミング言語C 第2版 ANSI規格準拠');">プログラミング言語C 第2版 ANSI規格準拠</a>」に関連する最近のエントリ
</h4>
<ul>
<li>
<a href="http://d.hatena.ne.jp/sirocco634/20090512/1242140262" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090512/1242140262', ' 16進数を10進数に変換する &#8211; 武蔵の日記');" target="_blank"> 16進数を10進数に変換する &#8211; 武蔵の日記</a>
</li>
<li>
<a href="http://d.hatena.ne.jp/sirocco634/20090510/1241924398" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/sirocco634/20090510/1241924398', ' C言語での引数の扱い &#8211; 武蔵の日記');" target="_blank"> C言語での引数の扱い &#8211; 武蔵の日記</a>
</li>
</ul>
<div class="hatena-asin-detail">
<p>
<a href="http://www.amazon.co.jp/dp/4320026926/?tag=hatena_st1-22&ascsubtag=d-7ibv" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.amazon.co.jp/dp/4320026926/?tag=hatena_st1-22&ascsubtag=d-7ibv', '');"><img class="hatena-asin-detail-image" title="プログラミング言語C 第2版 ANSI規格準拠" src="https://images-na.ssl-images-amazon.com/images/I/41W69WGATNL._SL160_.jpg" alt="プログラミング言語C 第2版 ANSI規格準拠" /></a>
</p>
<div class="hatena-asin-detail-info">
<p class="hatena-asin-detail-title">
<a href="http://www.amazon.co.jp/dp/4320026926/?tag=hatena_st1-22&ascsubtag=d-7ibv" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.amazon.co.jp/dp/4320026926/?tag=hatena_st1-22&ascsubtag=d-7ibv', 'プログラミング言語C 第2版 ANSI規格準拠');">プログラミング言語C 第2版 ANSI規格準拠</a>
</p>
<ul>
<li>
<span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/B%2EW%2E%A5%AB%A1%BC%A5%CB%A5%CF%A5%F3" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/B%2EW%2E%A5%AB%A1%BC%A5%CB%A5%CF%A5%F3', 'B.W.カーニハン');" class="keyword">B.W.カーニハン</a>,<a href="http://d.hatena.ne.jp/keyword/D%2EM%2E%A5%EA%A5%C3%A5%C1%A1%BC" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/D%2EM%2E%A5%EA%A5%C3%A5%C1%A1%BC', 'D.M.リッチー');" class="keyword">D.M.リッチー</a>,<a href="http://d.hatena.ne.jp/keyword/%C0%D0%C5%C4%C0%B2%B5%D7" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%C0%D0%C5%C4%C0%B2%B5%D7', '石田晴久');" class="keyword">石田晴久</a>
</li>
<li>
<span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%B6%A6%CE%A9%BD%D0%C8%C7" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%B6%A6%CE%A9%BD%D0%C8%C7', '共立出版');" class="keyword">共立出版</a>
</li>
<li>
<span class="hatena-asin-detail-label">発売日:</span> 1989/06/15
</li>
<li>
<span class="hatena-asin-detail-label">メディア:</span> 単行本
</li>
<li>
<span class="hatena-asin-detail-label">購入</span>: 28人 <span class="hatena-asin-detail-label">クリック</span>: 721回
</li>
<li>
<a href="http://d.hatena.ne.jp/asin/4320026926" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4320026926', 'この商品を含むブログ (206件) を見る');" target="_blank">この商品を含むブログ (206件) を見る</a>
</li>
</ul>
</div>
<div class="hatena-asin-detail-foot">
</div>
</div>
</div>