使用scanf与NSStrings

11

我希望用户输入一个字符串,并将输入分配给NSString。当前我的代码如下:

NSString *word; 

scanf("%s", &word);
8个回答

8

scanf 函数会读取到一个 C 字符串中(实际上是一组 char 数组),如下所示:

char word[40];

int nChars = scanf("%39s", word);   // read up to 39 chars (leave room for NUL)

您可以像这样将char数组转换为NSString:
NSString* word2 = [NSString stringWithBytes:word 
                                     length:nChars
                                   encoding:NSUTF8StringEncoding];

然而,scanf只适用于控制台(命令行)程序。如果您正在尝试在Mac或iOS设备上获取输入,则不应使用scanf来获取用户输入。


我是Objective C和Mac/iOS开发的新手。我正在编写一个基本的控制台应用程序,并希望使用scanf与NSString一起使用,于是我找到了这篇文章。我使用了上面的方法“stringWithBytes”,但是我收到了警告,说对象可能不支持该消息。虽然这只是一个编译时警告,但我搜索了更多信息,找到了“stringWithUTF8String”。你可以将其作为NSString的静态方法的消息使用,也可以将其与alloc一起使用“initWithUTF8String”,并从字符数组中获取NSString对象。 - Amogh Talpallikar
scanf可以使用char*吗?我不想使用固定的字符数组来限制输入。 - raffian
@SAFX:是的,但使用scanf存在风险,请参见此处的详细信息。这就是为什么我使用了固定大小的缓冲区并在scanf中限制了长度的原因。 - progrmr
@progrmr 或许这已经过时了?我在调用stringWithBytes方法时得到了“没有已知的类方法”的错误。 - sunny
@sunny 使用[NSString stringWithCString:word encoding:NSASCIIStringEncoding]代替。 - aj_ios

7

scanf 不支持任何对象类型。如果您有一个 C 字符串并想从中创建一个 NSString,请使用 -[NSString initWithBytes:length:encoding:]


你如何创建一个C字符串?你能编辑我的代码展示给我看吗? - Omar
一个 C 字符串是一个字符数组,所以你只需要写 char word[100] - W.K.S

7

scanf函数不能处理NSString类型的数据,因为scanf只适用于基本数据类型,比如:

  1. int
  2. float
  3. BOOL
  4. char

该怎么办?

实际上,字符串是由一系列单独的字符构成的。因此,要接受字符串输入,您可以读取这些字符序列并将其转换为字符串。

请使用:

[NSString stringWithCString:cstring encoding:1];

这里是一个可工作的示例:

NSLog(@"What is the first name?");
char cstring[40];
scanf("%s", cstring);

firstName = [NSString stringWithCString:cstring encoding:1];

以下是上述代码的逐行解释:
  1. 声明了一个名为cstring的变量,用于存储40个字符。
  2. 使用%s格式说明符告诉scanf函数期望一个字符列表。
  3. 最后,从读入的字符列表中创建了一个NSString对象。
运行项目;如果您输入一个单词并按下回车键,程序应该打印出您输入的相同单词。只要确保单词少于40个字符;如果输入更多字符,可能会导致程序崩溃——欢迎您自己测试一下!:]
来源:RW。

2
最好使用NSUTF8StringEncoding作为编码选项,而不是1,这样理解起来会更加清晰。 - Thomas Fankhauser
2
如何处理换行和空格? - anoop4real

4
这是我会这样做的方法:
char word [40];
scanf("%s",word);

NSString * userInput = [[NSString alloc] initWithCString: word encoding: NSUTF8StringEncoding];

请注意:由于word不是指针,而是实际的字符数组,因此您无需放置'&'。 - ManOx

1
是的,但sscanf可以,对于复杂的NSString解析可能是一个不错的解决方案。

1
也许这对您有用,因为它也接受带空格的字符串。
 NSLog(@"Enter The Name Of State");
 char name[20];
 gets(name);
 NSLog(@"%s",name);

0
NSFileHandle类是文件描述符的面向对象封装。对于文件,您可以在文件中读取、写入和查找。
NSFileHandle *inputFile = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [inputFile availableData];
NSString *word = [[NSString alloc]initWithData:inputData encoding:NSUTF8StringEncoding];

0

简单的解决方案是

char word[40];
scanf("%39s", word);
NSString* word2 = [NSString stringWithUTF8String:word];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接