2015-01-17 3 views
3

Когда я жестко кодирую эту строку и пытаюсь подстроитьWithRange, она работает нормально. Но когда я беру ввод пользователя как символ и передаю его в NSString, он генерирует исключение NSRange. Это потому, что я бросаю чар?substringWithRange работает с жестко закодированной строкой, но не с пользовательской строкой

Это не работает:

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

Однако, это делает:

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

Я также проверил, чтобы убедиться, что "otherWord" имеет правильное значение, которое он делает.

Любые предложения?

+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' array/string перед вызовом 'scanf()', который заменяет содержимое. (Исходя из того факта, что 'scanf()' для ввода строки без указания максимальной ширины поля является ужасно опасным, поскольку он может перехватить предоставленный буфер.) –

1

В вашем коде вы сначала создаете строку, используя массив символов. После того, что вы читаете ввод данных пользователем:

Изменение:

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

к:

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