Как получить первые слова N от NSString в Objective C?

Windows API поддерживает объекты, названные "Объекты Задания". Следующий код создаст "задание", которое настроено для закрытия всех процессов, когда главное приложение заканчивается (когда его дескрипторы очищены). Этот код должен только быть выполнен однажды.:

HANDLE ghJob = CreateJobObject( NULL, NULL); // GLOBAL
if( ghJob == NULL)
{
    ::MessageBox( 0, "Could not create job object", "TEST", MB_OK);
}
else
{
    JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };

    // Configure all child processes associated with the job to terminate when the
    jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
    if( 0 == SetInformationJobObject( ghJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)))
    {
        ::MessageBox( 0, "Could not SetInformationJobObject", "TEST", MB_OK);
    }
}

Тогда, когда каждый дочерний процесс будет создан, выполните следующий код, чтобы запустить каждый дочерний элемент каждый процесс и добавить его к объекту задания:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;

// Launch child process - example is notepad.exe
if (::CreateProcess( NULL, "notepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::MessageBox( 0, "CreateProcess succeeded.", "TEST", MB_OK);
    if(ghJob)
    {
        if(0 == AssignProcessToJobObject( ghJob, processInfo.hProcess))
        {
            ::MessageBox( 0, "Could not AssignProcessToObject", "TEST", MB_OK);
        }
    }

    // Can we free handles now? Not sure about this.
    //CloseHandle(processInfo.hProcess); 
    CloseHandle(processInfo.hThread);
}

ПРИМЕЧАНИЕ VISTA: См. , AssignProcessToJobObject всегда возвращают "доступ запрещен" на Vista при обнаружении с проблемами доступа запрещен с AssignProcessToObject () на перспективе.

9
задан philfreo 18 November 2009 в 01:36
поделиться

3 ответа

Если слова разделены пробелами:

NSInteger nWords = 10;
NSRange wordRange = NSMakeRange(0, nWords);
NSArray *firstWords = [[str componentsSeparatedByString:@" "] subarrayWithRange:wordRange];

, если вы хотите разбить на все пробелы:

NSCharacterSet *delimiterCharacterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSArray *firstWords = [[str componentsSeparatedByCharactersInSet:delimiterCharacterSet] subarrayWithRange:wordRange];

Затем

NSString *result = [firstWords componentsJoinedByString:@" "];
31
ответ дан 4 December 2019 в 05:52
поделиться

Хотя код Барри Уорка хорошо работает для английского языка, это не лучший способ обнаружения разрывов слов. Во многих языках, таких как китайский и японский, слова не разделяются пробелами. А в немецком языке, например, есть много соединений, которые трудно правильно разделить.

То, что вы хотите использовать, это CFStringTokenizer :

CFStringRef string; // Get string from somewhere
CFLocaleRef locale = CFLocaleCopyCurrent();

CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, string, CFRangeMake(0, CFStringGetLength(string)), kCFStringTokenizerUnitWord, locale);

CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
unsigned tokensFound = 0, desiredTokens = 10; // or the desired number of tokens

while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) && tokensFound < desiredTokens) {
  CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
  CFStringRef tokenValue = CFStringCreateWithSubstring(kCFAllocatorDefault, string, tokenRange);

  // Do something with the token
  CFShow(tokenValue);

  CFRelease(tokenValue);

  ++tokensFound;
}

// Clean up
CFRelease(tokenizer);
CFRelease(locale);
33
ответ дан 4 December 2019 в 05:52
поделиться

Основываясь на ответе Барри, я написал функция для этой страницы (все еще отдавая должное SO)

+ (NSString*)firstWords:(NSString*)theStr howMany:(NSInteger)maxWords {

    NSArray *theWords = [theStr componentsSeparatedByString:@" "];
    if ([theWords count] < maxWords) {
        maxWords = [theWords count];
    }
    NSRange wordRange = NSMakeRange(0, maxWords - 1);
    NSArray *firstWords = [theWords subarrayWithRange:wordRange];       
    return [firstWords componentsJoinedByString:@" "];
}
7
ответ дан 4 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: