stdio.hに追加されたいくつかの関数

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

stdlibに追加されたいくつかの関数

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-2017 CQ Publishing Co.,Ltd.

 

NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
追加された関数やマクロについて
math.hのマクロ
◆stdio.hに追加されたいくつかの関数/stdlibに追加されたいくつかの関数
C99規格で新規に追加された標準ライブラリ