开发者

Objective-C, Simple String input from Console?

开发者 https://www.devze.com 2023-04-02 04:32 出处:网络
I honestly did a) search using key words and b) read the \'questions with similar titles\' before asking this.

I honestly did a) search using key words and b) read the 'questions with similar titles' before asking this.

Also I tried to make this question more concise, but I had a hard time doing that in this case. If you feel the question is too wordy, I get it. Just don't try to answer.

I'm trying to write very simple objective-C programs that mirror the basic assignments in my introductory java class. I worked through an objective-c book over the summer and now I want to do lots of practice problems in objective-c, at the same time as I do java practice problems. I'm avoiding the objective-c GUI environment and just want to focus on working with the language for awhile. I still have a lot to learn about how to figure things out.

The program I'm duplicating from my java homework, is a standard type. I ask the user for number input and string input via the console. I was able to get numeric input from the console using an example I found here using scan f. (I will put the couple code lines below). But I'm unsure on how to get console input and store it in a string (NSString). I'm trying to learn to use the apple documentation and found a reference to a scan type command, but I cannot figure out how to USE the command. The one that seems likely is

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

Here's what I understand and works

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

scanf("%d", &age);


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

But I don't understand how to pickup an NSString called 'name'. I THINK I'm supposed to make my 'name'a pointer, because the class is NSString.

(BTW I did try using scanf to pickup the string, but the compiler doesn't like me trying to use scanf in conjunction with name. It says that I shouldn't be using 'scanf' because it's expecting a different kind of data. I'm not sure where I found the data type 'i'. I was looking through my text for different ideas. I'm guessing that scanf is related to 'scanfloat' which clearly deals with numeric data, so this is not a big surprise)

I realize that 'scanf' isn't the right command (and I don't really get why I can't even find scanf in the apple documentation - maybe it's C?)

I'm guessing that scanCharactersFromSet might be the right thing to use, but I just don't understand how you figure out what goes where in the command. I guess I tend to learn by example, and I haven't found an example. I'd like to figure out how to learn properly by reading the documentation. But 开发者_开发百科I'm not there yet.

NSString* name ;

scanf("%i", &name);

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

...

My book is oriented towards moving me into a gui environment, so it doesn't deal with input.

Thank you for any pointers you can give me.

Laurel


I would recommend ramping up on C. Objective-c is a thin layer over C and that knowledge will pay for itself over and over.

There's multiple ways in C to read:

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

For example:

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;

NOTE: the simple scanf is succeptible to buffer overruns. There's multiple approaches around this. see:

How to prevent scanf causing a buffer overflow in C?


Here is what Objective C looks like:

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


The way to get data from the standard input (or any other file handle) in cocoa is to use the NSFileHandle class. Check the docs for +fileHandleWithStandardInput


Here's how to get user input using Objective-C in 2020:

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;
}

Compile and run:

    $ clang -framework Foundation main.m -o app
0

精彩评论

暂无评论...
验证码 换一张
取 消