刚开始使用Java背景在Objective-C中编程,我迷路了。我有一个有效的程序,其目的是从控制台中获取一个人的姓名,年龄和体重,然后将这些值输出回用户。我的问题是,当我将数据输入控制台时,它只会显示我输入的第一个字母。然后它不会显示我字符串中的任何其他字符。所以这里有一些示例控制台数据来证明我的观点。
控制台:
2012-11-14 17:56:05.673 Tutorial[1757:403] Please Enter In Your Name
warning: this program uses gets(), which is unsafe.
C
2012-11-14 17:56:09.494 Tutorial[1757:403] Please Enter Your Age
1
2012-11-14 17:56:11.239 Tutorial[1757:403] Please Enter Your Weight
2
2012-11-14 17:56:13.205 Tutorial[1757:403]
Name: Chris
Age: 18
Weight: 200
正如你所看到的,它只会显示我输入内容的第一个字母,但它实际上是使用输入字符串。为什么发生这种情况呢?
功能声明:
#import "Person.h"
Person * readPersonData (Person * object);
void writePersonInformation(Person * object);
主要方法:
int main (int argc, const char * argv[])
{
@autoreleasepool
{
Person * p1 = [[Person alloc] init];
p1 = readPersonData(p1);
writePersonInformation(p1);
}
}
功能实现:
Person * readPersonData (Person * object)
{
char nameCharacters[100];
NSString * objectName;
int objectAge, objectWeight;
NSLog(@"Please Enter In Your Name");
gets(nameCharacters);
objectName = [[NSString alloc] initWithUTF8String:nameCharacters];
[object setName : objectName];
NSLog(@"Please Enter Your Age");
scanf("%i", &objectAge);
[object setAge : objectAge];
NSLog(@"Please Enter Your Weight");
scanf("%i", &objectWeight);
[object setWeight : objectWeight];
return object;
}
void writePersonInformation(Person * object)
{
NSLog(@"\nName: %@ \nAge: %i \nWeight: %i", object.getName, object.getAge, object.getWeight);
}
答案 0 :(得分:1)
gets()存在安全问题,因此建议相当长一段时间使用fgets()。
答案 1 :(得分:1)
我认为这个问题与Xcode 4.5的问题有关(见this)。
您在问题中没有说是从调试器控制台运行还是从命令行运行,但是从命令行尝试时会发生什么?
但是,您应该使用fgets()
,除非是停止运行时警告消息。
答案 2 :(得分:0)
使用fgets
将stdin传递给文件而不是gets
,这通常被大多数编译器标记为不安全。这至少会删除可能导致输入不显示的警告。以下是有关如何使用fgets
或者,您可以尝试禁止警告,可能有一些编译器指令(我知道VS中有)。我过去常常检查很多“不安全”的函数,发现可以减少编译器的烦恼。