2

嘿,伙计们,所以我正在尝试将 Objective c 作为我学校的一项独立学习来学习,而我的一个项目只是为了练习制作一个计算器程序,在该程序中,用户输入一串数字和运算符,程序将其分解并执行计算。现在我有输入,我试图让它找到运算符并将它们全部放在一个数组中,以便它可以对它们进行排序以查找操作顺序并使用索引来查找不同的术语;但是,当我尝试打印出数组以查看它是否包含字符时,它会输出一些奇怪的符号,例如苹果徽标或倒置的问号。我已经对我的问题进行了 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;
    }
    ...

您正在发送initWithStrings. s尚未分配。这导致s成为nil. 而且由于发送类似于 a 的消息isEqualToString:本质nil会评估即使 a在该范围内,您的分配也永远不会发生。NO@"*"operators[i]

不过很容易修复,只需将s作业替换为:

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

You don't need anything fancy for this. But: use stuff for what it is there for.

#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 回答