2015-01-17 4 views
3

문제의 문자열을 하드 코딩하고 substringWithRange를 시도하면 정상적으로 작동합니다. 그러나 사용자 입력을 char로 가져 와서 NSString으로 캐스트하면 NSRange 예외가 발생합니다. 내가 차콜을 던지고 있기 때문에 그런가?substringWithRange는 하드 코딩 된 문자열로 작동하지만 사용자 입력 문자열은 사용할 수 없습니다.

이 작동하지 않습니다

char word[30]; 
    NSString *otherWord = [NSString stringWithFormat:@"%s", word]; 
    scanf("%s", word); 
    NSString *firstCharacter = [otherWord substringWithRange:NSMakeRange(0, 3)]; 

그러나,이 일을 수행합니다 나는 또한 "otherWord는"이 수행 적절한 값을 가지고 있는지 확인하기 위해 검사

char word[30]; 
    NSString *otherWord = @"SomeString"; 
    scanf("%s", word); 
    NSString *firstCharacter = [otherWord substringWithRange:NSMakeRange(0, 3)]; 

.

제안 사항?

+0

당신은 사용자의 입력을 읽는 먼저 NSString''에 캐스팅된다. 'NSString * otherWord = [NSString stringWithFormat : @ "% s", word]; scanf ("% s", word); ' –

답변

1

char 단어 [30]을 무언가와 동일하게 설정해야합니다. 그렇지 않으면 subStringWithRange를 실행하도록 변환 할 때 문자가 충분하지 않습니다. 따라서 NSRange 예외입니다. 코드에서

char word[30] = {'a', 'b', 'c', 'd'}; 
scanf("%s", word); 
NSString *otherWord = [NSString stringWithCString:word encoding:NSASCIIStringEncoding]; 
NSString *firstCharacter = [otherWord substringWithRange:NSMakeRange(0, 3)]; 
NSLog(@"%@",firstCharacter); 
+0

'word 배열/문자열을 채우기 전에 내용을 대체하는'scanf()'를 호출하는 것은 의미가 없습니다. (최대 필드 너비를 지정하지 않고 문자열을 입력하는'scanf()'는 제공된 버퍼를 오버런시킬 수 있으므로 안전하지 않습니다.) –

1

, 당신은 문자 배열을 사용하여 첫 번째 문자열을 만들 수 있습니다. 그 후에는 사용자의 입력을 읽고 :

변경 :

NSString *otherWord = [NSString stringWithFormat:@"%s", word]; 
scanf("%s", word); 

에 :

scanf("%s", word); 
NSString *otherWord = [NSString stringWithCString:word encoding:NSUTF8StringEncoding];