如何在Objective C中从控制台获取输入?我担心的是避免缓冲区溢出的可能性,这就是为什么我要避开gets()
和scanf()/sscanf()
。从搜索StackOverflow,这就是我所见过的。目标C中的scanf()
是否更安全到我不必担心的程度?
就在最近,我找到了这个例子:我喜欢它;但是已经有了这样的课程吗?
printf("What is your name?");
NSFileHandle *input = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [NSData dataWithData:[input availableData]];
NSString *inputString = [[NSString alloc] initWithData:inputData
encoding:NSUTF8StringEncoding];
inputString = [inputString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
printf("Hello %s.n",[inputString UTF8String]);
答案 0 :(得分:1)
如您所示,可以使用标准C I / O功能。由于您使用的是Objective-C,因此不更安全。为避免缓冲区溢出问题,请使用fgets
而不是gets
。请注意,您将阅读C风格的字符串,如果需要NSString
,则需要将其转换。
在Cocoa级别,您可以在显示时使用NSFileHandle
。请注意,availableData
返回所有可用数据而不是下一行,但由于控制台设备通常设置为行模式,因此如果用户未提前输入,则返回的是下一行。
在较低级别,您可以查看read
。
HTH