2

やあみんなだから私は私の学校の独立した研究としてObjectiveCを学ぼうとしています、そして私のプロジェクトの1つは、ユーザーが一連の数字と演算子を入力し、プログラムがそれを分解して実行する計算機プログラムを作成することです計算。今、私は入力を持っており、演算子を見つけてそれらをすべて配列に入れて、それらを並べ替えて演算の順序を見つけ、インデックスを使用してさまざまな用語を見つけられるようにしようとしています。ただし、配列を印刷して文字を保持しているかどうかを確認しようとすると、アップルのロゴや逆さまの疑問符などの奇妙な記号が出力されます。私は自分の問題のSSCCEを作成しました-誰かが何が起こっているのか知っていますか?

int main(int argc, const char * argv[])
{
@autoreleasepool {

    NSString *calculation;
    char str[50] = {0};
    int count = 0;

    NSLog(@"What would you like to calculate?");
    scanf("%s", str);
    calculation = [NSString stringWithUTF8String:str];

    for (int i = 0; i < [calculation length]; i++) {
        NSRange range = NSMakeRange (i, 1);
        if([[calculation substringWithRange: range] isEqualToString: @"*"] ||
           [[calculation substringWithRange: range] isEqualToString: @"/"])
            count++;
    }

    char operators[count];
    for (int i = 0; i < count; i++) {
        for (int j = 0; j < [calculation length]; j++) {
            NSRange range = NSMakeRange (j, 1);
            NSString *s = [s initWithString:[calculation substringWithRange: range]];
            if([s isEqualToString:@"*"]){
                operators[i] = '*';
                break;
            }
            if([s isEqualToString:@"/"]){
                operators[i] = '/';
                break;
            }
        }
        NSLog(@"%c", operators[i]);
    }

}
return 0;
}
4

2 に答える 2

1

コードで何が起こっているかについての質問に答えるため。表示されている「奇妙な記号」は、operators[]配列のメモリ内の初期化されていない値です。

char []にガベージ値が残る理由を確認するには、コードの次のセクションを参照してください。

    ...
    NSString *s = [s initWithString:[calculation substringWithRange: range]];
    if([s isEqualToString:@"*"]){
        operators[i] = '*';
        break;
    }
    ...

に送信initWithStringしていsます。sまだ割り当てられていません。これにより、sになりnilます。isEqualToString:また、のようなメッセージを送信すると、がその範囲内にある場合でもnil基本的に評価されるため、割り当てが行われることはありません。NO@"*"operators[i]

sただし、簡単に修正できます。割り当てを次のように置き換えるだけです。

NSString *s = [calculation substringWithRange:range];
于 2012-11-15T20:31:22.580 に答える
0

これには特別なことは何も必要ありません。しかし:それが何のためにあるのかのために何かを使ってください。

#import <Foundation/Foundation.h>

int main()
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];

    char str[128];
    printf("Enter formula:\n");
    scanf("%s", str); // this is DAMN unsafe, btw

    NSMutableArray *arr = [NSMutableArray array];

    char *s = str;
    while (*s) {
        if (*s == '*') {
            [arr addObject:@"*"];
        } else if (*s == '/') {
            [arr addObject:@"/"];
        }
        s++;
    }
    printf("\n");

    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@", obj);
    }];

    [pool drain];
    return 0;
}
于 2012-11-15T20:05:19.220 に答える