2012-11-15 3 views
2

안녕하세요 여러분, 제 학교에 대한 독립적 인 학습으로 객관적인 C를 배우려고하고 있습니다. 단지 연습을위한 프로젝트 중 하나는 사용자가 숫자와 연산자 문자열을 입력하는 계산기 프로그램을 만드는 것입니다. 프로그램은 그것을 분해하고 계산을합니다. 지금 나는 입력 값을 가지고 있으며, 연산자를 찾아서 배열에 넣으므로 연산 순서를 찾고 연산자를 정렬하여 인덱스를 사용하여 다른 용어를 찾을 수 있습니다. 그러나 배열을 인쇄하여 글꼴을 보유하고 있는지 확인하려고하면 사과 로고 또는 거꾸로 물음표와 같은 이상한 기호가 출력됩니다. 내 문제에 대한 SSCCE를 만들었습니다 - 무슨 일이 일어나는 지 아는 사람이 있습니까?목표 C 문자 배열 문제

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

:하지만

쉬운 수정, 그냥이 함께 s 할당을 교체? –

답변

1

코드에서 어떤 일이 벌어지고 있는지에 대한 질문에 답변하십시오. "이상한 기호"는 operators[] 배열의 메모리에있는 초기화되지 않은 값입니다.

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

당신은 sinitWithString를 보내는 :

은 [] 쓰레기 값으로 남아있는 문자는 코드의이 섹션을 확인하는 이유를 참조하십시오. s은 아직 할당되지 않았습니다. 결과적으로 snil이됩니다. 그리고 과 같은 메시지를 nil으로 보내면 @"*"operators[i]으로 할당되지 않는 경우에도 본질적으로NO으로 계산됩니다. 왜`-characterAtIndex`를 사용하지 않는

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

'이것은 s가 0이됩니다.'- ARC에서만 발생합니다. –

+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 출력은'*/*'입니다. 하지만 어서 오너라. ** ** 시도해 보시지 ** ** –

+0

그냥 질문자 문제라고 ... –