2012-11-15 59 views
2

嘿傢伙,所以我想學習客觀的c作爲我的學校的獨立研究,我的一個項目只是練習是製作一個計算器程序,用戶輸入一串數字和運算符,該程序將其分解並進行計算。現在我有了輸入,我試着讓它找到運算符,並將它們全部放入數組中,以便它們可以對它們進行排序以找到操作順序並使用索引來查找不同的項;然而,當我嘗試打印數組以查看它是否保存字符時,它會輸出一些怪異的符號,如蘋果徽標或倒過來的問號。我對我的問題做了一個SSCCE - 有誰知道發生了什麼事?Objective C Char陣列問題

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; 
} 
+0

你爲什麼不使用'-characterAtIndex':

易修復,雖然,只需更換s分配這件事? –

回答

1

回答你關於你的代碼中發生了什麼的問題。您看到的「怪異符號」是您的operators[]陣列在內存中未初始化的值。

要見的原因是左[]垃圾值焦炭看看你的代碼的這一部分:您要發送initWithStrings

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

s尚未分配。這導致snil。並且因爲發送像isEqualToString:這樣的消息到nil本質上評估NO即使當@"*"在該範圍內,您將不會發生operators[i]的分配。

NSString *s = [calculation substringWithRange:range]; 
+0

'這導致s是零' - 僅在ARC下。 – 2012-11-15 20:32:11

+0

謝謝!這就是我最初嘗試的,但由於某種原因,它不起作用。現在都很好。 –

+0

@MattCooper我很高興這有幫助。我通常儘量不要過度提醒自我描述的學習練習,但是,RichardRoss建議使用'-characterAtIndex:'是很好的建議。它更高效,它不會每次都創建一個新的NSString,它只是返回一個'unichar',你可以用'=='來比較。而且由於組合字符集不太可能出現在一個簡單的計算器中(主要原因-'characterAtIndex:'被忽略),它應該是安全的。 – NJones

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; 
} 
+0

你的代碼是否關心操作的順序?該字符串@「3 * 6/2 * 4」的輸出是什麼? –

+0

@SpaceDust輸出將是'*/*'。但是,來吧,你爲什麼不**嘗試?** – 2012-11-15 20:30:27

+0

所以你說這只是問題的問題... –