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() is known to have security issues due to the possibility of a buffer overrun, so the recommendation for quite a while was to use fgets() instead.

于 2012-11-14T23:23:24.953 に答える
1

I think the issue relates to a problem with Xcode 4.5 (see this).

You don't say in your question whether you are running from the debugger console or from the command line, however what happens when you try it from the command line?

You should be using fgets() however, if for nothing else than to stop that runtime warning message.

于 2012-11-14T23:31:46.557 に答える
0

ほとんどのコンパイラで一般的に安全でないとマークされてfgetsいるファイルの代わりに、ファイルにstdinを渡すことを使用します。getsこれにより、少なくとも入力が表示されない原因となる可能性のある警告が削除されます。こちらが使い方の投稿ですfgets

取得するための安全な代替手段

または、警告を抑制しようとすることもできます。おそらく、それを実行するためのコンパイラ指令があります(VSにあることはわかっています)。私は以前、多くの「安全でない」関数に対して独自の境界チェックを行っていましたが、コンパイラーからの煩わしさを軽減することがわかりました。

于 2012-11-14T23:25:13.693 に答える