1

昨天刚开始用 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);
}
4

3 回答 3

1

众所周知,由于缓冲区溢出的可能性,gets() 存在安全问题,因此相当长一段时间以来的建议是改用 fgets()。

于 2012-11-14T23:23:24.953 回答
1

我认为这个问题与 Xcode 4.5 的问题有关(请参阅this)。

你没有在你的问题中说你是从调试器控制台还是从命令行运行,但是当你从命令行尝试它时会发生什么?

fgets()但是,如果只是为了停止该运行时警告消息,您应该使用它。

于 2012-11-14T23:31:46.557 回答
0

使用fgets为文件传递标准输入,而不是gets大多数编译器通常将其标记为不安全。这至少会消除可能导致输入不显示的警告。这是一个关于如何使用的帖子fgets

获取的安全替代方案

或者,您可以尝试抑制警告,可能有一些编译器指令可以做到这一点(我知道在 VS 中有)。我曾经对很多“不安全”的函数进行自己的边界检查,发现这样可以减少编译器的一些烦恼。

于 2012-11-14T23:25:13.693 回答