代码之家  ›  专栏  ›  技术社区  ›  wal

在宾语C中,如何将句子的第一个词首字母大写?

  •  34
  • wal  · 技术社区  · 15 年前

    我已经找到了如何将句子中的所有单词都大写,但不仅仅是第一个单词。

    NSString *txt =@"hi my friends!"
    [txt capitalizedString];
    

    我不想改为小写并大写第一个字符。我只想把第一个词的首字母大写而不改变其他词。

    9 回复  |  直到 10 年前
        1
  •  118
  •   mixel    10 年前

    这是另一个尝试:

    NSString *txt = @"hi my friends!";
    txt = [txt stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[txt substringToIndex:1] uppercaseString]];
    

    对于Swift语言:

    txt.replaceRange(txt.startIndex...txt.startIndex, with: String(txt[txt.startIndex]).capitalizedString)
    
        2
  •  15
  •   Ken Thomases    11 年前

    公认的答案是错误的。首先,不正确地对待 NSString 作为用户期望的“字符”。有代理项对。有组合序列。拆分这些将产生不正确的结果。第二,第一个字符的大写不一定产生与包含该字符的单词大写相同的结果。语言可以区分上下文。

    要做到这一点,正确的方法是让框架以适当的方式识别单词(可能还有句子)。并以适当的方式将其大写。

    [aMutableString enumerateSubstringsInRange:NSMakeRange(0, [aMutableString length])
                                       options:NSStringEnumerationByWords | NSStringEnumerationLocalized
                                    usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        [aMutableString replaceCharactersInRange:substringRange
                                      withString:[substring capitalizedStringWithLocale:[NSLocale currentLocale]]];
        *stop = YES;
    }];
    

    一个字符串的第一个单词可能与一个字符串的第一个句子的第一个单词不同。识别字符串的第一个(或每个)句子,然后将该(或那些)的第一个单词大写,然后在外部调用 -enumerateSubstringsInRange:options:usingBlock: 使用 NSStringEnumerationBySentences | NSStringEnumerationLocalized . 在内部调用中,传递 substringRange 由外部调用作为范围参数提供。

        3
  •  8
  •   Tuomas Pelkonen    15 年前

    使用

    - (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
    

    并将数组中的第一个对象大写,然后使用

    - (NSString *)componentsJoinedByString:(NSString *)separator
    

    把他们接回来

        4
  •  3
  •   Chris Nolet Chen_Wayne    11 年前
    pString = [pString
               stringByReplacingCharactersInRange:NSMakeRange(0,1)
               withString:[[pString substringToIndex:1] capitalizedString]];
    
        5
  •  1
  •   Ashok Kumar    10 年前

    你可以使用正则表达式。我已经完成了。对我来说很简单。你可以粘贴到下面的代码。 +(nsstring*)capitalizefirstcharacterofsentence:(nsstring*)句子{

    NSMutableString *firstCharacter = [sentence mutableCopy];
    NSString *pattern = @"(^|\\.|\\?|\\!)\\s*(\\p{Letter})";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
    [regex enumerateMatchesInString:sentence options:0 range:NSMakeRange(0, [sentence length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
        //NSLog(@"%@", result);
        NSRange r = [result rangeAtIndex:2];
        [firstCharacter replaceCharactersInRange:r withString:[[sentence substringWithRange:r] uppercaseString]];
    }];
    NSLog(@"%@", firstCharacter);
    return firstCharacter;
    

    } //调用此方法 nsstring*resultstence=[用户类CapitalizeFirstCharacterOfSenstence:yourtexthere];

        6
  •  0
  •   alesplin    15 年前

    为了有选择,我建议:

    NSString *myString = [NSString stringWithFormat:@"this is a string..."];
    
    char *tmpStr = calloc([myString length] + 1,sizeof(char));
    
    [myString getCString:tmpStr maxLength:[myString length] + 1 encoding:NSUTF8StringEncoding];
    
    int sIndex = 0;
    
    /* skip non-alpha characters at beginning of string */
    while (!isalpha(tmpStr[sIndex])) {
        sIndex++;
    }
    
    toupper(tmpStr[sIndex]);
    
    myString = [NSString stringWithCString:tmpStr encoding:NSUTF8StringEncoding];
    

    我在工作,没有Mac电脑来测试这个,但是如果我没记错的话,你就不能用了 [myString cStringUsingEncoding:NSUTF8StringEncoding] 因为它返回 const char * .

        7
  •  0
  •   Antoine    10 年前

    在Swift中,您可以按照以下步骤使用此扩展名:

    extension String {
        func ucfirst() -> String {
            return (self as NSString).stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: (self as NSString).substringToIndex(1).uppercaseString)
        }    
    }
    

    这样调用字符串:

    var ucfirstString:String = "test".ucfirst()
    
        8
  •  0
  •   Johan Kool    10 年前

    Swift中的另一种解决方案:

    var str = "hello"
    
    if count(str) > 0 {
        str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
    }
    
        9
  •  0
  •   pheedsta    10 年前

    我知道这个问题具体要求一个客观的C答案,但是这里有一个针对swift 2.0的解决方案:

    let txt = "hi my friends!"
    var sentencecaseString = ""
    
    for (index, character) in txt.characters.enumerate() {
        if 0 == index {
            sentencecaseString += String(character).uppercaseString
        } else {
            sentencecaseString.append(character)
        }
    }
    

    或作为扩展:

    func sentencecaseString() -> String {
        var sentencecaseString = ""
        for (index, character) in self.characters.enumerate() {
            if 0 == index {
                sentencecaseString += String(character).uppercaseString
            } else {
                sentencecaseString.append(character)
            }
        }
        return sentencecaseString
    }
    
    推荐文章