challenge printfの自作

printf関数を自作してください。
printfの説明は不要だと思います。とりあえずWikiPediaのリンクをはっておきます。

実際にはsprintf関数を作ってください。
注意事項
  • 標準でついているprintf系関数の使用禁止
  • 標準でついているライブラリ以外の使用禁止
  • 引数・返り値等の仕様はできるだけ似せればよい

可変長引数など、言語によっては難しい/不可能な仕様もありますが、いろいろ工夫して本物に近づくようにしてみてください。
1
2
3
4
5
6
7
#include <string.h>

// なにもフォーマットしてない
int mysprintf(char *str, const char *format, ... ){
    strcpy(str, format);
    return strlen(str);
}

Posted feedbacks - C#

まじめに実装するのは面倒だし、クックブックに向かないので #4410に書かれていたように、仕様を限定して(%d %f %s %cのみに対応して)実装。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
static string PrintF(string format, params object[] args)
{
  Regex re = new Regex(@"%[dfsc%]");
  int i = 0;
  return re.Replace(format, delegate(Match m)
  {
    if (args.Length <= i)
      return m.Value;
    object o = args[i++];
    string r = null;
    switch (m.Value[1])
    {
      case 'd':
        r = Convert.ToDecimal(o).ToString();
        break;
      case 'f':
        r = Convert.ToDecimal(o).ToString();
        break;
      case 's':
        r = (o == null) ? "" : o.ToString();
        break;
      case 'c':
        if (o.GetType().IsValueType)
        {
          r = Convert.ToString((char)o);
        }
        else
        {
          string s = (o == null) ? "" : o.ToString();
          r = s.Length > 0 ? new String(s[0], 1) : "";
        }
        break;
      default:
        r = m.Value;
        break;
    }
    return r;
  });
}

Index

Feed

Other

Link

Pathtraq

loading...