我最近一直在编写一些基本的命令行程序(我想在夏天保持我的技能敏锐),但是printf
和scanf
已经开始惹恼我了。我不是一个出色的C程序员,不得不进入printf
/ scanf
并且他们的不稳定性(或者更糟糕的是,fgets
及其同类)并不是真正让我进入令人欣慰的设置(正是因为这个原因,我喜欢NSLog
,其舒适的默认命名空间及其自动NSString
和NSObject
解析。)
令我失望的是,NSLog没有对应的功能,并打印了很多额外的“垃圾”(时间,功能名称等,以及最后的换行符),这很多都失败了在我使用它的目的。所以我决定坐下来进行不同类型的编程练习并编写函数来替换满足我需求的printf和scanf。
瞧,我想出了我自己的NSInput.h
文件,其中包含两个函数:NSPrint()
和NSScan()
。这两个函数在printf和scanf之后很多都建模,但也处理NSString
。我知道我在这里踩着神圣的命名空间,但是我无法抗拒(IFPrint
和IFScan
听起来很糟糕!)。
现在,虽然我很高兴我有工作代码(你可以找到源代码here),但我知道它效率不高(令我惊讶的是,NSPrint
在Xcode 4中,LLDB下的printf
效率要高几倍,但这不是重点。我需要一些关于如何使功能更好,更有效的建议。例如,NSScan
会将收到的va_list
转换为NSPointerArray
,并使用NSScanner
来扫描格式和输入字符串,所以我知道有很多改善的空间。
基本上,我想知道的是,是否有任何可以而且应该修复的明显错误?我错过了什么巨大的东西?我是否应该被称为被宠坏并重新使用printf
和scanf
?请告诉我,我在这里寻找输入(双关语不是!)......
提前致谢!
答案 0 :(得分:3)
我的想法:
FILE*
,即您应该将界面建模为fprintf()
和fscanf()
以获得更大的灵活性。fputs()
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);
}