任何人都可以解释如何在目标C中进行黑客等级测试。特别是“从STDIN读取输入。打印输出到STDOUT”部分
如何在objective-c中读取输入和输出?
到目前为止我得到的是像
这样的输入 NSFileHandle *fileHandler = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [fileHandler availableData];
NSString *inputString = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding];
但是要打印输出,以下内容不会在HackerRank控制台上打印任何内容(但在Xcode控制台上完美运行)
NSFileHandle* fileHandler=[NSFileHandle fileHandleWithStandardOutput];
[fileHandler writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]];
答案 0 :(得分:11)
“从STDIN读取输入。将输出打印到STDOUT”的最简单方法是使用scanf和printf。
这是一个 示例模板 ,可以帮助您入门:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int count;
scanf("%d", &count);
NSMutableArray *inputIntegers = [NSMutableArray new];
for (int i=0; i<count; i++) {
int inputElement;
scanf("%d", &inputElement);
[inputIntegers addObject:[NSNumber numberWithInt:inputElement]];
}
//to print a specific element:
printf("printing element 0: %d", (int)[inputIntegers[0] integerValue]);
[pool drain];
return 0;
}
在你拍摄这段旅程之前,先做一些事情:
而不是
- (NSInteger)sumOfNumbers : (NSInteger)a and:(NSInteger)b {
return a + b;
}
使用
int sumOfNumbers(int a, int b){
return a + b;
}
快乐编程。
答案 1 :(得分:3)
刚刚接受了其中一项测试,我选择立即退出main.m并进入Objective-C,如下所示:
#import <Foundation/Foundation.h>
//Objective-C helper class to take over from main.m
//.h
@interface MainClass : NSObject
+ (BOOL)startMain;
@end
//.m
@implementation MainClass
+ (BOOL)startMain {
//Read the STDIN here using the Objective-C wrapper methods
NSInteger n = [self readInt];
[self printInt:n];
NSArray *numbers = [self readIntArrayOfLength:n];
[self printIntNumberArray:numbers];
return YES;
}
+ (NSInteger)readInt {
int n;
scanf("%i",&n);
return n;
}
+ (NSArray *)readIntArrayOfLength:(NSInteger)len {
NSMutableArray *result = [NSMutableArray array];
for (int i =0; i < len; i++) {
[result addObject:[NSNumber numberWithInt:[self readInt]]];
}
return [result copy];
}
//Helpers to print an int and array of ints to STDOUT
+ (void)printInt:(NSInteger)i {
printf("%li\n",(long)i);
}
+ (void)printIntNumberArray:(NSArray *)array {
printf("[");
[array enumerateObjectsUsingBlock:^(NSNumber *n, NSUInteger idx, BOOL * _Nonnull stop) {
printf("%li",(long)[n integerValue]);
if (idx < array.count-1) {
printf(",");
}
}];
printf("]\n");
}
@end
//This is what will actually run when you hit "Run Code"
int main(int argc, char * argv[]) {
@autoreleasepool {
return [MainClass startMain];
}
}
现在,您可以使用Objective-C从这里做任何您喜欢的事情。
因此,在此示例中,示例输入为:
3
11 2 4
会产生这个输出:
3
[11,2,4]
本身没有用,但说明了成功阅读。
在Swift中它更简单,但无论如何都要完成相同的代码:
func readInt() -> Int? {
if let ln = readLine() {
return Int(ln)
}
return nil
}
func readIntArray() -> [Int]? {
if let ln = readLine() {
return ln.characters.split(" ").filter({ Int(String($0)) != nil }).map({ Int(String($0))! })
}
return nil
}
let n = readInt()!
let array = readIntArray()!
print(n)
print(array)
函数返回选项,因为即使您要强制解包输入,最好在代码中发生nil可选的崩溃,而不是样板。
答案 2 :(得分:2)
#import <Foundation/Foundation.h>
int sum(int a, int b) {
return a + b;
}
int main() {
@autoreleasepool {
int T;
int A;
int B;
printf("Enter number of test cases: ");
scanf("%d", &T);
for (int i=0; i < T; i++) {
scanf("%d", &A);
scanf("%d", &B);
printf("%d\n", sum(A,B));
}
}
return 0;
}
应该这样做。
答案 3 :(得分:0)
你的问题对于SO来说真的太笼统了,如果它很快就会被关闭也不要感到惊讶。一般来说,您需要询问具体问题,展示您尝试过的内容等等。但是,如果您只是在提供一些提示后才能帮助您... ...
你不是说你是否已经是程序员或特别是了解Objective-C,假设两者:
在Xcode中查看命令行工具项目类型
查看NSFileHandle
及其方法,例如fileHandleWithStandardInput
请注意,您还可以使用C stdio函数,根据需要将C样式转换为Objective-C样式字符串等。
答案 4 :(得分:0)
我创建了github repo,其中包含一些用objective-c编写的hackerrank问题解决方案。它处于起步阶段,也可以通过添加您的解决方案做出贡献。
答案 5 :(得分:0)
由于Objective-C是C的超集,因此可以使用C方法读取和打印:
NSInteger n;
char *input[25];
NSMutableArray *strings = [NSMutableArray array];
NSString *s;
NSString *temp;
scanf("%lu", &n);
for (NSInteger i = 0; i < n; ++i) {
scanf("%s", input);
s = [NSString stringWithUTF8String:input];
[inputs addObject:s];
}
如果 n 类型为 int ,则可以将其读取为:
scanf("%d", &n);