printf / scanf替换方法:需要一些反馈/建议

时间:2010-08-08 21:25:31

标签: objective-c printf scanf xcode4

我最近一直在编写一些基本的命令行程序(我想在夏天保持我的技能敏锐),但是printfscanf已经开始惹恼我了。我不是一个出色的C程序员,不得不进入printf / scanf并且他们的不稳定性(或者更糟糕的是,fgets及其同类)并不是真正让我进入令人欣慰的设置(正是因为这个原因,我喜欢NSLog,其舒适的默认命名空间及其自动NSStringNSObject解析。)

令我失望的是,NSLog没有对应的功能,并打印了很多额外的“垃圾”(时间,功能名称等,以及最后的换行符),这很多都失败了在我使用它的目的。所以我决定坐下来进行不同类型的编程练习并编写函数来替换满足我需求的printf和scanf。

瞧,我想出了我自己的NSInput.h文件,其中包含两个函数:NSPrint()NSScan()。这两个函数在printf和scanf之后很多都建模,但也处理NSString。我知道我在这里踩着神圣的命名空间,但是我无法抗拒(IFPrintIFScan听起来很糟糕!)。

现在,虽然我很高兴我有工作代码(你可以找到源代码here),但我知道它效率不高(令我惊讶的是,NSPrint在Xcode 4中,LLDB下的printf效率要高几倍,但这不是重点。我需要一些关于如何使功能更好,更有效的建议。例如,NSScan会将收到的va_list转换为NSPointerArray,并使用NSScanner来扫描格式和输入字符串,所以我知道有很多改善的空间。

基本上,我想知道的是,是否有任何可以而且应该修复的明显错误?我错过了什么巨大的东西?我是否应该被称为被宠坏并重新使用printfscanf?请告诉我,我在这里寻找输入(双关语不是!)......

提前致谢!

1 个答案:

答案 0 :(得分:3)

我的想法:

  • 不要称它们为NSxxxxx,NS是为Cocoa和Foundation保留的。
  • 应修改这两个函数以接受FILE*,即您应该将界面建模为fprintf()fscanf()以获得更大的灵活性。
  • 如果您使用fputs()
  • ,那么printf函数可能会更好

e.g。

void NSFPrint (FILE* fp, NSString *format, ...) 
{
    // Create the variable argument list.
    va_list args;
    va_start(args, format);

    // Using NSString, parse the argument list and convert it to a C string.
    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], fp);
     va_end(args);
}
  • 考虑在UTF-8以外的编码中添加对输入和输出的支持。
  • 您的scanf替换混合了stdin上的C缓冲IO和Unix无缓冲IO。这可能不好。
  • 即使不需要,您的scanf替换也会读取到行尾。我没有仔细检查过,但是如果扫描格式没有占用整行,那么看起来你正在丢弃输入。这可能不好。