1
NSMutableString *stringa = [[NSMutableString alloc] initWithFormat:@"%@", surnameField.text];

if ([stringa length] < 3) {
    [stringa appendString:@"x"];
}

NSMutableString *consonanti = [[NSMutableString alloc] init];

NSCharacterSet *vocali = [NSCharacterSet characterSetWithCharactersInString:@"aeiouàèìòùáéíóúAEIOUÀÈÌÒÙÁÉÍÓÚ"];

NSRange r;

for (int i=0; i < [stringa length]; i++) {

    r = [stringa rangeOfCharacterFromSet:vocali];

    if (r.location != NSNotFound) {
        [consonanti appendFormat:@"%c",[stringa characterAtIndex:i]];
    }
    else {
    }
}

cfField.text = consonanti;
[stringa release];
[consonanti release];

cfField.text の結果は常に子音と母音ですが、結果は子音のみである必要があります。知らない。

4

4 に答える 4

3

ループの反復ごとに文字列全体に母音が存在するかどうかをテストしているため、常に各文字を順番に追加します。

for ループでは、代わりに次のコードが必要です。

if(![vocali characterIsMember:[stringa characterAtIndex:i]])
    [consonanti appendFormat:@"%C",[stringa characterAtIndex:i]];

これにより、個々の文字が母音文字セットに含まれていないことが確認され、変更可能な文字列に追加されます。

于 2011-10-28T22:25:41.283 に答える
1

を使用characterAtIndex:して個々の文字にアクセスする場合、合成文字は分音記号などの単一のコンポーネントに分割されることに注意してください。

Unicode 言語の分音記号は、たとえば、母音の文字列の "é" のようなアクセントです。

より良い方法は、構成された文字に対して文字列を反復することです。

// A string with composed diacritic characters
// In clear text it is "Renée Ångström"
NSString *stringWithComposedChars = @"Rene\u0301e A\u030Angstro\u0308m";
NSString *vowels = @"aeiouàèìòùáéíóúäëïöü";

NSMutableString *consonants = [NSMutableString string];

[stringWithComposedChars
 enumerateSubstringsInRange:NSMakeRange(0,[stringWithComposedChars length])
                                        options:NSStringEnumerationByComposedCharacterSequences
                                        usingBlock: ^(NSString *substring,NSRange rng1, NSRange rng2, BOOL *stop)
{
    if ( [vowels rangeOfString:substring options:NSCaseInsensitiveSearch|NSWidthInsensitiveSearch].location == NSNotFound ) {
        [consonants appendString:substring];
    }
}];

NSLog(@"Original string: \"%@\" - Vowels removed: \"%@\"", stringWithComposedChars, consonants);

このスニペットにより、基本母音と分音記号の両方について、合成文字の元の文字列が消去されることがわかります。

于 2013-04-19T14:36:17.487 に答える
0

これもうまくいくはずです - 最初にすべてのボーカルを文字列の分割文字として使用して取り除き、次に受け取ったすべての文字列部分を再び連結します:

NSArray*  onlyConsonantsArray  = [stringa componentsSeparatedByCharactersInSet:vocali];
NSString* onlyConsonantsString = [onlyConsonantsArray componentsJoinedByString: @""];

パフォーマンスについてはわかりませんが、短く見えます:-)。

于 2013-04-19T15:30:25.380 に答える