2

我最近一直在写一些基本的命令行程序(我想在整个夏天保持我的技能),但是printfscanf开始烦了。我不是一个出色的 C 程序员,不得不进入printf/scanf和他们的不稳定性(甚至更糟,fgets以及他们的同类)并没有完全让我处于一个令人欣慰的环境中(正是因为这个原因,我喜欢NSLog它的令人欣慰的默认设置命名空间及其自动NSStringNSObject解析)。

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

瞧,我想出了自己的NSInput.h文件,其中包含两个函数:NSPrint()NSScan(). 这两个函数在很大程度上模仿了 printf 和 scanf,但也处理了NSString's。我知道我在这里踩到了神圣的名称空间,但我无法抗拒(IFPrint而且IFScan听起来很糟糕!)。

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

基本上,我想知道的是,我犯了哪些明显的错误可以而且应该改正?有什么我错过的大事吗?我应该被称为被宠坏并重新使用printfandscanf吗?请告诉我,我在这里寻找输入(双关语不是故意的!)...

提前致谢!

4

1 回答 1

3

我的想法:

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

例如

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 替换在标准输入上混合了 C 缓冲 IO 和 Unix 无缓冲 IO。这可能很糟糕。
  • 即使不需要,您的 scanf 替换也会读取到行尾。我没有仔细检查,但如果扫描格式没有消耗整行,看起来你正在丢弃输入。这可能很糟糕。
于 2010-08-09T09:05:48.793 回答