● snprintf
この関数の使用例をリスト11に,実行結果をリスト12に示します.編集して書き出す場合に便利に利用できます.sprintfだけでは,転送元のデータがどのくらいの大きさか調べないと使いにくかったのですが,これで万全です.
〔リスト11〕snprintfの例(test134.c)
|
/*
*snprintfについて
*/
#include <stdio.h>
#include <math.h>
main()
{
FILE *out;
char buf[1024];
snprintf(buf,10,"12345678901234567890");
printf("%s\n",buf);
snprintf(buf,50,"12345678901234567890");
printf("%s\n",buf);
out = fopen("test.dat","w");
fwrite(buf,1,1024,out);
fclose(out);
}
|
|
〔リスト12〕リスト11の実行結果データダンプリスト
|
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 3132 3334 3536 3738 3930 3132 3334 3536 1234567890123456
00000010 3738 3930 0001 0000 3cfb 2200 c876 f877 7890....<{".Hvxw
00000020 aafb 2200 3502 0000 0000 d877 3cc1 dc77 *{".5.....Xw<A\w
00000030 10ca dc77 a8fb 2200 0100 0000 0000 0000 .J\w({".........
00000040 c800 d877 0cfb 2200 10ca dc77 40b8 dc77 H.Xw.{"..J\w@8\w
00000050 0000 0000 ac01 0000 60fb 2200 0000 0000 ....,...`{".....
00000060 e538 f877 0000 2300 08b6 2300 0000 0000 e8xw..#..6#.....
00000070 3cfb 2200 0000 0000 3800 0000 2000 0000 <{".....8... ...
00000080 2000 0000 6cfb 2200 f8eb fd7f 581b 0d61 ...l{".xk}.X..a
00000090 3400 00c0 28fc 2200 2053 0061 3400 00c0 4..@(|". S.a4..@
000000a0 50b6 e577 1800 0000 0030 0000 fcff ab00 P6ew.....0..|.+.
000000b0 2000 0000 f8eb fd7f 0000 0000 f8eb fd7f ...xk}.....xk}.
000000c0 0000 0000 f8eb fd7f e800 0000 0099 0d61 ....xk}.h......a
000000d0 0300 0000 f8eb fd7f 0000 0000 7900 2300 ....xk}.....y.#.
000000e0 00e0 fd7f b57c f877 e8fb 2200 1800 0000 .`}.5|xwh{".....
000000f0 e400 0000 0000 2300 0300 0000 0000 0000 d.....#.........
〜以下略〜
|
|
● vsnprintf
この関数の使用例をリスト13に,実行結果をリスト14とリスト15に示します.可変引き数リストを使用したい場合,このvsnprintfを使えば簡単にできるはずです.
〔リスト13〕vsnprintfの例(test135.c)
|
#include <stdarg.h>
/*
*vsnprintfについて
*/
#include <stdio.h>
void func(int num, ...);
main()
{
func(4,"aa","bb","cc","dd");
}
void func(int num, ...)
{
FILE *out1;
FILE *out2;
va_list ap;
va_list dup_ap;
char *str;
char buf[1024];
int ix;
va_start(ap, num);
__va_copy(dup_ap,ap);
vsnprintf(buf,10,"%s:%s:%s:%s:%s",ap);
out1 = fopen("test1.dat","w");
fwrite(buf,1,1024,out1);
fclose(out1);
vsnprintf(buf,20,"%s--%s--%s--%s--%s--%s",dup_ap);
out2 = fopen("test2.dat","w");
fwrite(buf,1,1024,out2);
fclose(out2);
va_end(ap);
va_end(dup_ap);
}
|
|
〔リスト14〕リスト13の実行結果データダンプリスト(その1)
|
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 6161 3a62 623a 6363 3a00 0100 80b4 e577 aa:bb:cc:....4ew
00000010 2c00 0000 d803 5f61 581b 0d61 4fd8 d4ac ,...X._aX..aOXT,
00000020 0700 0100 0000 0000 f8fa 2200 0000 0000 ........xz".....
00000030 e538 f877 0000 2300 68c7 2300 0000 0000 e8xw..#.hG#.....
00000040 10ca dc77 40b8 dc77 0000 0000 8a01 0000 .J\w@8\w........
00000050 3cfb 2200 c876 f877 aafb 2200 3502 0000 <{".Hvxw*{".5...
00000060 0000 d877 3cc1 dc77 10ca dc77 a8fb 2200 ..Xw<A\w.J\w({".
00000070 0100 0000 0000 0000 c800 d877 0cfb 2200 ........H.Xw.{".
00000080 10ca dc77 58fb 2200 0b00 0000 7039 f877 .J\wX{".....p9xw
00000090 0000 2300 9808 2300 0b00 0000 0000 0000 ..#...#.........
000000a0 30fb 2200 0002 0000 0000 2300 10cb 2300 0{".......#..K#.
000000b0 7801 2300 9e00 0000 50b6 fc77 16b5 fc77 x.#.....P6|w.5|w
000000c0 2db5 fc77 00ec fd7f f8eb fd7f 0000 0000 -5|w.l}.xk}.....
000000d0 0000 2300 b8ca 2300 7801 2300 a900 0000 ..#.8J#.x.#.)...
000000e0 50b6 fc77 16b5 fc77 2db5 fc77 7801 2300 P6|w.5|w-5|wx.#.
000000f0 7801 2300 442b 4000 0000 0000 4006 2300 x.#.D+@.....@.#.
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000100 e800 0000 0099 0d61 0300 0000 f8eb fd7f h......a....xk}.
00000110 0000 0000 7801 2300 7801 2300 b57c f877 ....x.#.x.#.5|xw
00000120 e8fb 2200 4006 2300 e400 0000 0000 2300 h{".@.#.d.....#.
00000130 0300 0000 0000 0000 0000 0000 0000 0000 ................
〜中略〜
000003a0 1030 4000 46f0 0ddf 68fe 2200 f6b4 0861 .0@.Fp._h~".v4.a
000003b0 f803 040a 60fe 2200 68fe 2200 5014 4000 x...`~".h~".P.@.
000003c0 2000 040a 442b 4000 88fe 2200 9814 4000 ...D+@..~"...@.
000003d0 e003 040a 0050 4000 0000 0000 0000 0000 `....P@.........
000003e0 402b 4000 a02a 4000 98fe 2200 5f10 4000 @+@. *@..~"._.@.
000003f0 0040 4000 0050 4000 b8fe 2200 915d 0061 .@@..P@.8~"..].a
|
|
〔リスト15〕リスト13の実行結果データダンプリスト(その2)
|
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 6161 2d2d 6262 2d2d 6363 2d2d 6464 2d2d aa--bb--cc--dd--
00000010 891d e000 d803 5f61 581b 0d61 4fd8 d4ac ..`.X._aX..aOXT,
00000020 0700 0100 0000 0000 f8fa 2200 0000 0000 ........xz".....
00000030 e538 f877 0000 2300 68c7 2300 0000 0000 e8xw..#.hG#.....
00000040 10ca dc77 40b8 dc77 0000 0000 8a01 0000 .J\w@8\w........
00000050 3cfb 2200 c876 f877 aafb 2200 3502 0000 <{".Hvxw*{".5...
00000060 0000 d877 3cc1 dc77 10ca dc77 a8fb 2200 ..Xw<A\w.J\w({".
00000070 0100 0000 0000 0000 c800 d877 0cfb 2200 ........H.Xw.{".
00000080 10ca dc77 58fb 2200 0b00 0000 7039 f877 .J\wX{".....p9xw
00000090 0000 2300 9808 2300 0b00 0000 0000 0000 ..#...#.........
000000a0 30fb 2200 0002 0000 0000 2300 10cb 2300 0{".......#..K#.
000000b0 7801 2300 9e00 0000 50b6 fc77 16b5 fc77 x.#.....P6|w.5|w
000000c0 2db5 fc77 00ec fd7f f8eb fd7f 0000 0000 -5|w.l}.xk}.....
000000d0 0000 2300 b8ca 2300 7801 2300 a900 0000 ..#.8J#.x.#.)...
000000e0 50b6 fc77 16b5 fc77 2db5 fc77 7801 2300 P6|w.5|w-5|wx.#.
000000f0 7801 2300 442b 4000 0000 0000 4006 2300 x.#.D+@.....@.#.
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000100 e800 0000 0099 0d61 0300 0000 f8eb fd7f h......a....xk}.
00000110 0000 0000 7801 2300 7801 2300 b57c f877 ....x.#.x.#.5|xw
00000120 e8fb 2200 4006 2300 e400 0000 0000 2300 h{".@.#.d.....#.
00000130 0300 0000 0000 0000 0000 0000 0000 0000 ................
〜中略〜
000003a0 1030 4000 46f0 0ddf 68fe 2200 f6b4 0861 .0@.Fp._h~".v4.a
000003b0 f803 040a 60fe 2200 68fe 2200 5014 4000 x...`~".h~".P.@.
000003c0 2000 040a 442b 4000 88fe 2200 9814 4000 ...D+@..~"...@.
000003d0 e003 040a 0050 4000 0000 0000 0000 0000 `....P@.........
000003e0 402b 4000 a02a 4000 98fe 2200 5f10 4000 @+@. *@..~"._.@.
000003f0 0040 4000 0050 4000 b8fe 2200 915d 0061 .@@..P@.8~"..].a
|
|
● vsscanf
入力データ中のaa--bb--cc--dd--というデータが分割されて可変引き数リストに読み込まれました.同じようにvscanfやvfscanfも利用できます.使用例をリスト16に,実行結果をリスト17に示します.
〔リスト16〕vsnprintfの例(test136.c)
|
#include <stdarg.h>
/*
*vsscanfについて
*/
#include <stdio.h>
void func(int num, ...);
main()
{
func(4,"aa","bb","cc","dd");
}
void func(int num, ...)
{
FILE *out1;
FILE *out2;
va_list ap;
va_list dup_ap;
va_list dup_ap1;
char *str;
char buf[1024];
char *data;
int ix;
va_start(ap, num);
__va_copy(dup_ap,ap);
vsnprintf(buf,10,"%s:%s:%s:%s:%s",ap);
out1 = fopen("test1.dat","w");
fwrite(buf,1,1024,out1);
fclose(out1);
vsnprintf(buf,20,"%s--%s--%s--%s--%s--%s",dup_ap);
out2 = fopen("test2.dat","w");
fwrite(buf,1,1024,out2);
fclose(out2);
vsscanf(buf,"%s--%s--%s--%s--%s",dup_ap1);
va_start(dup_ap1, num);
data = va_arg(dup_ap1,char *);
printf("%s\n",data);
data = va_arg(dup_ap1,char *);
printf("%s\n",data);
data = va_arg(dup_ap1,char *);
printf("%s\n",data);
data = va_arg(dup_ap1,char *);
printf("%s\n",data);
va_end(ap);
va_end(dup_ap);
va_end(dup_ap1);
}
|
|
〔リスト17〕リスト16の実行結果データダンプリスト
|
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 6161 2d2d 6262 2d2d 6363 2d2d 6464 2d2d aa--bb--cc--dd--
00000010 891d e000 d803 5f61 581b 0d61 4fd8 d4ac ..`.X._aX..aOXT,
00000020 0700 0100 0000 0000 f8fa 2200 0000 0000 ........xz".....
00000030 e538 f877 0000 2300 68c7 2300 0000 0000 e8xw..#.hG#.....
00000040 10ca dc77 40b8 dc77 0000 0000 8a01 0000 .J\w@8\w........
00000050 3cfb 2200 c876 f877 aafb 2200 3502 0000 <{".Hvxw*{".5...
00000060 0000 d877 3cc1 dc77 10ca dc77 a8fb 2200 ..Xw<A\w.J\w({".
00000070 0100 0000 0000 0000 c800 d877 0cfb 2200 ........H.Xw.{".
00000080 10ca dc77 58fb 2200 0b00 0000 7039 f877 .J\wX{".....p9xw
00000090 0000 2300 9808 2300 0b00 0000 0000 0000 ..#...#.........
000000a0 30fb 2200 0002 0000 0000 2300 10cb 2300 0{".......#..K#.
000000b0 7801 2300 9e00 0000 50b6 fc77 16b5 fc77 x.#.....P6|w.5|w
000000c0 2db5 fc77 00ec fd7f f8eb fd7f 0000 0000 -5|w.l}.xk}.....
000000d0 0000 2300 b8ca 2300 7801 2300 a900 0000 ..#.8J#.x.#.)...
000000e0 50b6 fc77 16b5 fc77 2db5 fc77 7801 2300 P6|w.5|w-5|wx.#.
000000f0 7801 2300 342c 4000 0000 0000 4006 2300 x.#.4,@.....@.#.
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000100 e800 0000 0099 0d61 0300 0000 f8eb fd7f h......a....xk}.
00000110 0000 0000 7801 2300 7801 2300 b57c f877 ....x.#.x.#.5|xw
00000120 e8fb 2200 4006 2300 e400 0000 0000 2300 h{".@.#.d.....#.
00000130 0300 0000 0000 0000 0000 0000 0000 0000 ................
〜中略〜
000003a0 1030 4000 46f0 0ddf 68fe 2200 f6b4 0861 .0@.Fp._h~".v4.a
000003b0 f803 040a 60fe 2200 68fe 2200 2015 4000 x...`~".h~". .@.
000003c0 2000 040a 342c 4000 88fe 2200 6815 4000 ...4,@..~".h.@.
000003d0 e003 040a 0050 4000 0000 0000 0000 0000 `....P@.........
000003e0 302c 4000 902b 4000 98fe 2200 5f10 4000 0,@..+@..~"._.@.
000003f0 0040 4000 0050 4000 b8fe 2200 915d 0061 .@@..P@.8~"..].a
|
|
● strtof,strtold関数
GCC3.2の環境ではstrtoldが定義されていません.strtofは問題なく動作します(リスト18).実行結果は次のとおりです.
〔リスト18〕strtofの例(test137.c)
|
#include <stdarg.h>
/*
*strtofについて
*/
#include <stdio.h>
#include <stdlib.h>
void func(int num, ...);
main()
{
float wk1;
long double wk2;
const char test1[] = "0.1236548";
const char test2[] = "98612665464.545236548";
wk1 = strtof(test1,NULL);
// wk2 = strtold(test2,NULL);
printf("%f\n",wk1);
// printf("%Lf\n",wk2);
}
|
|
$ ./test137
0.123655
● strtoll,strtoull関数
どちらも問題なく動作しました(リスト19).実行結果は以下のとおりです.
〔リスト19〕strtoll,strtoullの例(test138.c)
|
#include <stdarg.h>
/*
*strtollについて
*/
#include <stdio.h>
#include <stdlib.h>
main()
{
long long int wk1;
long long unsigned int wk2;
const char test1[] = "-965485412";
const char test2[] = "98612464";
wk1 = strtoll(test1,NULL,10);
wk2 = strtoull(test2,NULL,10);
printf("%ld\n",wk1);
printf("%ld\n",wk2);
}
|
|
$ ./test138
-965485412
98612464
● atoll,llabs,lldiv関数
GCC3.2の環境において,この中ではllabsだけ定義されていました(リスト20).実行結果は以下のとおりです.
〔リスト20〕atollの例(test139.c)
|
#include <stdarg.h>
/*
*strtollについて
*/
#include <stdio.h>
#include <stdlib.h>
main()
{
// lldiv_t res;
long long int wk1;
long long int wk2;
const char test1[] = "98612464";
// wk1 = atoll(test1);
wk1 = -653587458;
wk2 = llabs(wk1);
printf("%ld\n",wk2);
// res = lldiv(wk2, wk1);
// printf("%d\n",res.quot);
// printf("%d\n",res.rem);
}
|
|
$ ./test139
653587458
Copyright 2003 岸 哲夫
Copyright 1997-2024 CQ Publishing Co.,Ltd.
 記事内インデックス 連載インデックスはこちら Interfaceのトップ |
|
|
|