
そういえばlinuxってitoaないんだよなあと思って書いてみた
使用例
最初の引数が、文字列に変換したい数値
2番目の引数が、文字列のポインタ(宣言時に余裕を持たせるべき)
3番目の引数が、だいたいの桁数(余裕を持たせるべきだけど、文字列の数よりは小さく)
自分で使うことを想定して作ってるから汎用性はあまりないかも(3番目の引数が必要な時点で、ね)
他の関数を使わないことを前提にしてるけど、もうちょいいい方法があるかも
こっそりアドバイスしてくれると嬉しい
*おまけ*
ltoa
void itoa(int i,char *str,int c){
int d = c;
int flag = 0;
if(i < 0){
flag = 1;
i *= -1;
}
str[c--] = '\0';
while(i != 0){
str[c--] = i%10 + '0';
i /= 10;
}
if(flag == 1){
str[c--] = '-';
}
d -= c;
while(d--){
str[i++] = str[i + c + 1];
}
}
使用例
#include <stdio.h>
void itoa(int,char*,int);
int main(){
int i = 12345;
char str[20];
itoa(i,str,19);
printf("%s\n",str);
i = -12345;
itoa(i,str,19);
printf("%s\n",str);
return 0;
}
最初の引数が、文字列に変換したい数値
2番目の引数が、文字列のポインタ(宣言時に余裕を持たせるべき)
3番目の引数が、だいたいの桁数(余裕を持たせるべきだけど、文字列の数よりは小さく)
自分で使うことを想定して作ってるから汎用性はあまりないかも(3番目の引数が必要な時点で、ね)
他の関数を使わないことを前提にしてるけど、もうちょいいい方法があるかも
こっそりアドバイスしてくれると嬉しい
*おまけ*
ltoa
void ltoa(long i,char *str,int c){
int d = c;
int flag = 0;
if(i < 0){
flag = 1;
i *= -1;
}
str[c--] = '\0';
while(i != 0){
str[c--] = i%10 + '0';
i /= 10;
}
if(flag == 1){
str[c--] = '-';
}
d -= c;
while(d--){
str[i++] = str[i + c + 1];
}
}


初めて、C言語の記事を書きます
今回のコードは、整数から16進数文字列を返す関数です。
itoh()はint型の整数とchar*型のポインタを受け取って、その整数を16進数文字列にしてそのポインタの先へ格納します。
*p++ = "0123456789abcdef"[v % 0x10];
ポイントはここです!(geekポイント60/100ぐらいです)
Cでは、文字列をリテラル表記した場合、それはその文字列が格納されたメモリのアドレス、即ちchar型へのポインタを表しています。
この場合、"0123456789abcdef"は'0'が格納されているアドレスを表しているので、[]で指定した値をそのアドレスに足した
アドレスの内容参照ということになり、例えば、渡された整数が、0x0fの場合0x0f%0x10=0x0fになるので、'0'のアドレスに0x0f足したアドレスは'f'が格納されたアドレスということになるわけです。
あと、何故こーいうitoh()とかitoa()などの関数が渡されたポインタの値をそのまま戻り値にしているんだ?と思われるC初級者の方はこのコードのmain()のコードを見てもらえればわかるとおもいます。: printf("%d => %s", num, itoh(num, s))
今回のコードは、整数から16進数文字列を返す関数です。
#include <stdio.h>
#include <string.h>
char *itoh(int, char *);
int main() {
int num = 0x0ffffffe;
char s[9];
return ( printf("%d => %s", num, itoh(num, s)) ) ? 0 : -1;
}
/* int to hex */
char *itoh(int v, char *s) {
char *p = s;
if (v<0)
return NULL;
while (v) {
*p++ = "0123456789abcdef"[v % 0x10];
v /= 0x10;
}
if (p==s)
*p++ = '0';
*p = '\0';
return strrev(s);
}
itoh()はint型の整数とchar*型のポインタを受け取って、その整数を16進数文字列にしてそのポインタの先へ格納します。
*p++ = "0123456789abcdef"[v % 0x10];
ポイントはここです!(geekポイント60/100ぐらいです)
Cでは、文字列をリテラル表記した場合、それはその文字列が格納されたメモリのアドレス、即ちchar型へのポインタを表しています。
この場合、"0123456789abcdef"は'0'が格納されているアドレスを表しているので、[]で指定した値をそのアドレスに足した
アドレスの内容参照ということになり、例えば、渡された整数が、0x0fの場合0x0f%0x10=0x0fになるので、'0'のアドレスに0x0f足したアドレスは'f'が格納されたアドレスということになるわけです。
あと、何故こーいうitoh()とかitoa()などの関数が渡されたポインタの値をそのまま戻り値にしているんだ?と思われるC初級者の方はこのコードのmain()のコードを見てもらえればわかるとおもいます。: printf("%d => %s", num, itoh(num, s))
