FC2ブログ

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

sprintf関数の実装(簡易版) 

前から興味のあった「sprintf関数」を実装してみたいと思います。
しかし、変換指定文字列の "%x"・"%o"・"%f"・"%e"などの実装が面倒なので
今回は、"%c"・"%s"・"%d" の三つを実装したいと思います。

#include < stdarg.h> //可変個引数を使うため
#include < stdlib.h> //itoa関数を使うため

int sprintf ( char *str, const char *format, ... )
{
    va_list ap;

    int count = 0;
    char *p, *str;

    p = (char *)format;

    /* itoa関数用。int型の扱える整数は21億ぐらいまでらしいので10桁+'\0'の配列 */
    char dbuf[11];

    va_start ( ap, format );

    while ( *p )
    {
        if( *p != '%' ) {
           *s++ = *p++;
           count++;
        }

        if( *p == '%' ) {
           p++;
           switch ( *p )
           {
             case 's':
                   p++;
                   str = va_arg ( ap, char * )
                   while( *str ) {
                     *s++ = *str++;
                     count++;
                   }
                   break;
             case 'd':
                   p++;
                   str = itoa ( va_arg ( ap , int ), dbuf );
                   while ( *str ) {
                     *s++ = *str++;
                     count++;
                   }
                   break;
             case 'c':
                   p++;
                   *s++ = va_arg ( ap, int );
                   count++;
                   break;
             default:
                   *s++ = '%';
                   count++;
                   break;
           }
        }
    }

    *s = '\0';

    va_end ( ap );
    return count;
}

めちゃくちゃコードが長くなりました。
それに、かなりコードが見にくいです。 orz

バグなどがありましたら、コメントしていただけるとうれしいです。
※このコードの実行は自己責任でお願いします。
スポンサーサイト
あたまいいなwwほんと
[ 2009/11/17 23:17 ] [ 編集 ]
このコメントは管理人のみ閲覧できます
[ 2012/01/11 15:57 ] [ 編集 ]
コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。