【问题标题】:Objective-C, Simple String input from Console?Objective-C,来自控制台的简单字符串输入?
【发布时间】:2011-09-01 04:35:43
【问题描述】:

老实说,我做了 a) 使用关键词搜索 b) 在问这个问题之前阅读“具有相似标题的问题”。

我也试图让这个问题更简洁,但在这种情况下我很难做到这一点。如果你觉得这个问题太罗嗦,我明白了。只是不要试图回答。

我正在尝试编写非常简单的 Objective-C 程序,以反映我介绍性 Java 课程中的基本任务。整个夏天我都读完了一本 Objective-C 的书,现在我想在 Objective-C 中做很多练习题,同时我做 Java 练习题。我正在避免使用 Objective-c GUI 环境,只想专注于使用该语言一段时间。关于如何解决问题,我还有很多东西要学。

我从 java 作业中复制的程序是标准类型。我要求用户通过控制台输入数字和字符串。我能够使用我在此处使用 scan f 找到的示例从控制台获取数字输入。 (我将在下面放置几行代码)。但我不确定如何获取控制台输入并将其存储在字符串(NSString)中。我正在尝试学习使用苹果文档并找到对扫描类型命令的引用,但我无法弄清楚如何使用该命令。一个似乎很可能是

scanCharactersFromSet:(NSCharacterSet )scanSet intoString:(NSString *)name;

这是我的理解和工作方式

int age = 0;
NSLog (@"How old are y'all?");

scanf("%d", &age);


NSLog (@"\n Wow, you are %d !", age);

但我不明白如何获取一个名为“name”的 NSString。我认为我应该将我的“名称”设为指针,因为该类是 NSString。

(顺便说一句,我确实尝试使用 scanf 来获取字符串,但编译器不喜欢我尝试将 scanf 与 name 结合使用。它说我不应该使用“scanf”,因为它期待不同的类型的数据。我不确定我在哪里找到数据类型“i”。我正在查看我的文本以寻找不同的想法。我猜 scanf 与“scanfloat”有关,它清楚地处理数字数据,所以这是不是什么大惊喜)

我意识到 'scanf' 不是正确的命令(而且我真的不明白为什么我什至无法在苹果文档中找到 scanf - 也许它是 C?)

我猜想 scanCharactersFromSet 可能是正确的使用方法,但我只是不明白您如何弄清楚命令中的内容。我想我倾向于通过例子来学习,我还没有找到一个例子。我想通过阅读文档来弄清楚如何正确学习。但我还没到。

NSString* name ;

scanf("%i", &name);

//scanCharactersFromSet:(NSCharacterSet *)scanSet intoString:(NSString **)name;

...

我的书旨在让我进入 gui 环境,因此它不处理输入。

感谢您给我的任何指示。

月桂

【问题讨论】:

    标签: objective-c string input


    【解决方案1】:

    我会建议增加 C。Objective-c 是 C 的一个薄层,知识将一次又一次地为自己付出代价。

    C 中有多种读取方式:

    http://www.ehow.com/how_2086237_read-string-c.html

    例如:

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    char str[50] = {0};                  // init all to 0
    printf("Enter you Last name: ");
    scanf("%s", str);                    // read and format into the str buffer
    printf("Your name is %s\n", str);    // print buffer
    
    // you can create an NS foundation NSString object from the str buffer
    NSString *lastName = [NSString stringWithUTF8String:str];
    
    // %@ calls description o object - in NSString case, prints the string
    NSLog(@"lastName=%@", lastName);
    
    [pool drain];
    return 0;
    

    注意:简单的 scanf 可能会导致缓冲区溢出。围绕这个有多种方法。见:

    How to prevent scanf causing a buffer overflow in C?

    【讨论】:

    • 谢谢布雷扬。我会仔细阅读这个。我会先看看我是否能弄清楚如何做那件事。
    • 像这样使用 scanf 可能很危险,如果用户输入超过 49 个字符,那么他们就可以开始覆盖任意内存。
    • @Thayne - 同意 - 简单的例子。添加了指向关于此的 SO 帖子的链接。
    【解决方案2】:

    这是 Objective C 的样子:

      NSString *FNgetInput() {
            @autoreleasepool {
                 return [[[NSString alloc] initWithData:[[NSFileHandle fileHandleWithStandardInput] availableData] encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
            }
        }
    

    【讨论】:

      【解决方案3】:

      在 cocoa 中从标准输入(或任何其他文件句柄)获取数据的方法是使用 NSFileHandle 类。查看+fileHandleWithStandardInput的文档

      【讨论】:

        【解决方案4】:

        以下是 2020 年使用 Objective-C 获取用户输入的方法:

        main.m

        #import <Foundation/Foundation.h>
        
        int main(int argc, const char * argv[]) {
            @autoreleasepool {
                // insert code here...
                NSLog(@"Hello, World!");
        
                char str[50] = {0};                  // init all to 0
                printf("Enter you Last name: ");
                scanf("%s", str);                    // read and format into the str buffer
                printf("Your name is %s\n", str);    // print buffer
        
                // you can create an NS foundation NSString object from the str buffer
                NSString *lastName = [NSString stringWithUTF8String:str];
        
                // %@ calls description o object - in NSString case, prints the string
                NSLog(@"lastName=%@", lastName);
        
                return 0;
            }
            return 0;
        }
        

        编译运行:

            $ clang -framework Foundation main.m -o app
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-15
          • 1970-01-01
          • 2021-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多