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 - Python

%%, %d, %f, %sに対応。フラグ文字はつけても無視されます。(glib拡張にある'I'など[A-Za-z]にマッチするフラグがあった場合、結果がおかしくなるかエラーになります)

14行目、int(arg.next()).__str__()でなくstr(int(arg.next()))とすると
    elif fmt[-1] == "d": return str(int(arg.next()))
TypeError: 'str' object is not callable
のようなエラーが出たので__str__()を使いました。
 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
import re

def sprintf(str, *args):
  def getPercent():
    index = str.find("%")
    while index != -1:
      yield index
      t = str[index+2:].find("%")
      if t == -1: raise StopIteration
      index += t + 2

  def parseFormat(fmt, arg):
    if fmt[-1] == "%": return "%"
    elif fmt[-1] == "d": return int(arg.next()).__str__()
    elif fmt[-1] == "s": return arg.next().__str__()
    elif fmt[-1] == "f": return float(arg.next()).__str__()
    else: return "__Error or Unsupported__"

  s = ""
  arg = (i for i in args)
  index = 0
  for i in getPercent():
    s += str[index:i]
    fmt = re.match("%.*?[A-Za-z%]", str[i:]).group()
    s += parseFormat(fmt, arg)
    index = i + len(fmt)
  s += str[index:]
  return s

print sprintf("%d, %s%d(%s)", 2007, "Nov.", 27, "Tue") # => 2007, Nov.27(Tue)
print sprintf("%d/%d = %f%%", 12, 34, 12.0/34*100) # => 12/34 = 35.2941176471%

Index

Feed

Other

Link

Pathtraq

loading...