
No.5ベストアンサー
- 回答日時:
★『OAKS16MINI』って組み込み系?
・sprintf 関数はありますか?
この関数もない場合は itoa() 関数を自前で用意することになります。
下に簡単なサンプルを載せておきます。
サンプル:
char *itoa( int value, char buff[], int radix )
{
static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
char *head = buff;
char *tail = buff;
char temp;
// マイナス符号を文字列に変換
if ( value < 0 ){
*tail++ = '-';
value = -value;
}
// 整数値を文字列に変換
if ( value == 0 ){
*tail++ = '0';
}
else for ( head = tail ; value != 0 ; value /= radix ){
*tail++ = table[ value % radix ];
}
*tail = '\0';
// 文字列の左右入れ替え
for ( tail-- ; head < tail ; head++, tail-- ){
temp = *head;
*head = *tail;
*tail = temp;
}
return buff;
}
以上。
この回答への補足
上のサンプルをそのまま使わせていただきましたら
static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
の行で
parse error at near '。'
とエラーがでましたが、どうしたらよいのですか、教えてください。
色々とすみません
No.11
- 回答日時:
> 16進数での入力値をascii変換するプログラムを作ってます。
それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?どうせ1バイトのデータを16進文字列に変換できればよいのでしょう?
itoaを使ってもよいですが、状況次第では必ずしも効率がよいというわけではありませんので、専用の変換関数を作ってしまえばよいのではないでしょうか?
例えば、
char *btoa(char a[2], unsigned char b)
{
static const char xdigits[] = "0123456789ABCDEF";
a[0] = xdigits[b >> 4];
a[1] = xdigits[b & 0xf];
return a;
}
のような専用関数を作ればよいと思います。
複数バイトを連続して処理するケースが多いと思うので、故意に末尾のナル文字は格納していません。
なお、静的記憶域期間を持つconst属性付きのオブジェクトは、デフォルトでfar領域に配置されます。もしnear領域にROMがあるなら、xdigitsはnearにした方がずっと高速になります。
far領域の場合でも、計算で求めるよりはおそらく表引きの方が高速でしょう。
No.10
- 回答日時:
すでに回答が出ていると思いますが、以前H8/3052用に作った関数を貼っておきます。
(動作実績あり)/* =============================================================================
itoa
整数を文字に変換する。
引数
(in) value変換元の整数
(out) buff変換後の数値文字列を格納する文字配列のアドレス
戻り値
なし
備考
atoi はCの stdlib.h に含まれているが、itoa は標準では存在しないので
あえて自作した。
===============================================================================
*/
void itoa(int value, char *buff)
{
char *p;
int mod;
// 入力した値の正負を文字にする。
if( 0 > value ) {
*buff++ = '-';
value = -value;
}
p = buff;
// 入力した値を下位の桁から順に文字にする。
do{
mod = value % 10 + 48;
*p++ = (char)mod;
value /= 10;
}while(value);
*p = '\0';// 文字列の最後に '\0' を追加して締める。
strrev(buff);// 文字列の上位の桁から始まるように並べ替える。
}
/* =============================================================================
strrev
文字列を最後から先頭に並べ変える
引数
(in) s変換元の整数
戻り値
並べ替えた文字列
備考
文字列の最後に '\0' が含まれていること。
===============================================================================
*/
char *strrev(char *s)
{
char *ret = s;
char *t = s;
char c;
while( *t != '\0' )
t++;
t--;
while(t > s) {
c = *s;
*s = *t;
*t = c;
s++;
t--;
}
return ret;
}
No.9
- 回答日時:
★最初にマイコンには詳しくはないです。
>16進数での入力値をascii変換するプログラムを作ってます。
>それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?
↑
16進数の整数を入力するのですか?
普通に整数を入力してその入力値を16進文字列に変換したいだけなの?
ちょっとやりたい事がわからなくなってきました。補足を…。
・ちなみに文字列の左右入れ替えは必要ですね。
詳しくは回答者 No.8 さんのアドバイスをお読み下さい。
あと符号なし整数値を16進4桁の文字列に変換したいだけなら次の関数でもOKです。
サンプル:
char *itoh( char buff[], unsigned int hexVal )
{
static const char table[] = "0123456789abcdef"; ←大文字がよければ書き換え
int pos = 4; ←16進4桁の『4』
char *tail = (buff + pos);
for ( *tail-- = '\0' ; pos > 0 ; pos-- ){
*tail-- = table[ hexVal & 0xF ];
hexVal >>= 4;
}
return buff;
}
解説:
・今度のサンプルでは16進4桁に限定しているため文字列の左右入れ替えは必要ありません。
処理的にはやはり hexVal の下位の 4ビット(16進数)から順番に文字列に変換しています。
また剰余や除算を使わずにビットANDとビットシフトを使っています。
2、4、8、16、32進数などはビット処理した方が少し高速になります。
上記のサンプルは4桁に限定しているので 0x100 の整数は『0100』という文字列になります。
16進n桁に改良したい場合は itoh 関数の引数に int pos を記述すれば対応できます。
・あとエラーの件ですがそのままコピー&ペーストすると間違いなくエラーです。
理由はインデント部を全角空白文字で表現しているからです。
上記のサンプルでもインデント部は全角空白です。
よって空白文字をタブ文字か半角空白にエディタなどで一括変換してからコンパイルして下さい。
時間があったらサンプル関数の処理の手順も考えてみて下さい。なぜこれで整数から文字列に
変換できるのか。ってね。
・以上。
余談:
>準化委員会が「1つの機能に 1つの関数」という意向を持っていたからだと風の噂で聞いたことがあります
私も準化委員会が『1つの機能に 1つの関数』という意向を…というのは聞いた事があります。
このことが itoa に関係するのですか?
でもそれなら strtoi、strtol があるので atoi もなくなってもいい気がしますね。
atoi は存在するのはなぜだろう?
No.8
- 回答日時:
#5 の関数では下位桁から順に処理するので, 左右の入れ替えは必要です. そうしないと, 256 を 16進に変換すると (本来 100 になるはずが) 001 になります (確認してみてください). う~, プロセッサが持っているであろう (アセンブリの) swap が使いたい....
ちなみに itoa が標準に入らなかったのは, 標準化委員会が「1つの機能に 1つの関数」という意向を持っていたからだと風の噂で聞いたことがあります (itoa の機能は sprintf に含まれる) >#3.
No.7
- 回答日時:
>static const char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
の行で
>parse error at near '。'
>とエラーがでましたが、どうしたらよいのですか、教えてください。
>色々とすみません
その前の行が怪しい気がしますが。
エラーの意味は、「'。'の近くで文法上異常でコンパイルできません」と言っています。簡単に言うとコメントじゃない'。'があるので、C言語の文法としてコンパイルできませんってところです。
>16進数での入力値をascii変換するプログラムを作ってます。それには、itoa関数が最適だと考えたのですが、他に何かお勧めってあります?
16進の文字列に変換するためには、sprintfを利用するか(jactaさんが書かれている通り実装しだいですが使用メモリ量が増大します)。
自前で16進の文字列に変換するしかありません。Oh-Orangeさんのコードを使ってください。
私としてはROM68KB/RAM2KBなので、十分ROM容量は足りると思うので自前のitoaを使う分には気にしなくて大丈夫だと思います。
>16進数での入力値
マイコンであれば、入力値は2進数(binary)です。
16進数は表記の問題で、16進数での入力値とは普通言いません。まるで、文字列で16進数を受け取っているかのように聞こえてしまいます。
>処理系は、どう調べたらいいのか、わからないです。
処理系とは、実行する時のOSの種類と使用しているコンパイラの名前です。
ネットで質問するときに、これらの情報を省略して質問するとユーザーの多いVisualC++かGNUのgccだと思われてしまいます。
マイコンの場合は独自な仕様のC言語が多いので、かならずマイコンの名前とコンパイラの名称(1つのマイコンで複数の種類のコンパイラが使える場合があるため)を書いてもらうと的確な答えが返せます。
No.4
- 回答日時:
すでに回答が出ているように、itoaは標準関数ではありません。
処理系がサポートしていないのであれば、itoa関数を自作する以外には使えるようにする方法はありません。
No.3
- 回答日時:
★訂正。
・回答を少し間違いました。
整数を文字列に変換するには strtol ではなくて sprintf 関数を使って下さい。
・以上。
★Tacosanさんへ。
>ちなみに itoa 自体は「Microsoft の独自関数」というわけではないです.
>K&R の C にあって (だから Unix の C ならほとんどあるはず),
>それを Microsoft が (というのも歴史的におかしいけど) とりこんだんだと思いますよ>#1
情報有り難うございます。
確かに DOS 時代から itoa 関数を良く使っていました。
Unix 系や Microsoft 社の歴史的な事は良く分かりませんが…。
ISO C ではなぜ itoa 関数が無いのでしょうね。
No.2
- 回答日時:
どの処理系を使っていますか?
itoa という関数は ISO C にはないはずなので, 処理系によってはないかもね.
ちなみに itoa 自体は「Microsoft の独自関数」というわけではないです. K&R の C にあって (だから Unix の C ならほとんどあるはず), それを Microsoft が (というのも歴史的におかしいけど) とりこんだんだと思いますよ>#1
この回答への補足
ありがとうございます
処理系は、どう調べたらいいのか、わからないです。
OAKS16MINIを使って、プログラムをやっています。
これだけじゃ、不足ですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) エクセル VBAで複数セル選択時エラーになる問題 3 2022/10/04 02:40
- その他(プログラミング・Web制作) Pythonでエクセルファイルの列を指定してスライス 3 2022/08/28 17:35
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) この関数の誤りを教えて下さい。 3 2023/08/08 07:36
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) この関数の間違いを教えて下さい 2 2023/08/07 22:40
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
strstrを利用しない文字列検索...
-
C言語のステップ数をカウントす...
-
CStringのFindで文字列検索を行...
-
C言語のisdigit関数を使った問...
-
gccで入力した文字列をトークン...
-
C言語、単語ごとに改行したい
-
sscanfの使い方
-
sscanfとscanfの違いがよくわか...
-
C言語:配列の中の文字を。。。
-
ブランクのチェック
-
文字列中に含まれる文字の個数...
-
C言語 strlen 再入力を促す
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
数字以外が入力されたらエラー...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
ブランクのチェック
-
教えていただけませんか?C言語...
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報