У кого-нибудь есть хороший правильный алгоритм

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

25
задан Mateen Ulhaq 22 November 2011 в 07:26
поделиться

8 ответов

Если я не неправильно понял Ваш вопрос, я не думаю, что Вам нужно к самокрутке, класс TextInfo может сделать это для Вас.

using System.Globalization;

CultureInfo.InvariantCulture.TextInfo.ToTitleCase("GeOrGE bUrdEll")

возвратит "George Burdell. И можно использовать собственную культуру, если существуют некоторые специальные включенные правила.

Обновление: Michael (в комментарии к этому ответу) указал, что это не будет работать, если вход будет всеми заглавными буквами, так как метод предположит, что это - акроним. Наивное обходное решение для этого является к.ToLower () текстом прежде, чем отправить его ToTitleCase.

18
ответ дан Community 22 November 2011 в 07:26
поделиться
  • 1
    @hadley, которого я хотел избегать использования @export, потому что тогда R CMD check жаловался на недокументированные параметры (я hadn’t зарегистрировал метод с тех пор it’s предполагаемый быть невидимым так или иначе). Однако я не могу воспроизвести это теперь: никакой .Rd файл сгенерирован и никакой R CMD check, предупреждение отображено для недостающих параметров. У меня, вероятно, была некоторая пустая строка в комментарии документа заранее, заставляя неполную документацию быть сгенерированным для этого метода. – Konrad Rudolph 27 June 2015 в 09:19

Какой язык программирования Вы используете? Много языков позволяют функции обратного вызова для соответствий регулярного выражения. Они могут привыкнуть к propercase соответствие легко. Регулярное выражение, которое использовалось бы, довольно просто, просто необходимо соответствовать всем словесным символам, как так:

/\w+/

, С другой стороны, можно уже извлечь первый символ, чтобы быть дополнительным соответствием:

/(\w)(\w*)/

Теперь можно получить доступ к первым символьным и последовательным символам в соответствии отдельно. Функция обратного вызова может тогда просто возвратить конкатенацию хитов. В псевдо Python (я на самом деле не знаю Python):

def make_proper(match):
    return match[1].to_upper + match[2]

Кстати, это также обработало бы случай “O'Reilly”, потому что “O” и “Reilly” будут подобраны отдельно и оба propercased. Существуют однако другие особые случаи, которые не обрабатываются хорошо алгоритмом, например, “McDonald's” или обычно любым apostrophed словом. Алгоритм произвел бы “Mcdonald'S” для последнего. Специальная обработка для апострофа могла быть реализована, но это вмешается в первый случай. Нахождение thereotical идеального решения не возможно. На практике это могло бы помочь рассмотрению длины части после апострофа.

1
ответ дан Konrad Rudolph 22 November 2011 в 07:26
поделиться
  • 1
    @cboettig Да, @method является тегом для документации (.Rd файл), и @S3method для механизма пространства имен. Вам требуются оба этих дня, если у Вас есть свое собственное NAMESPACE файл. Вам только нужно @export, если Вы действительно хотите сделать метод видимым вне пространства имен пакета. – Gavin Simpson 3 November 2012 в 17:48

Вот, возможно, наивный C# implementation:-

public class ProperCaseHelper {
  public string ToProperCase(string input) {
    string ret = string.Empty;

    var words = input.Split(' ');

    for (int i = 0; i < words.Length; ++i) {
      ret += wordToProperCase(words[i]);
      if (i < words.Length - 1) ret += " ";
    }

    return ret;
  }

  private string wordToProperCase(string word) {
    if (string.IsNullOrEmpty(word)) return word;

    // Standard case
    string ret = capitaliseFirstLetter(word);

    // Special cases:
    ret = properSuffix(ret, "'");
    ret = properSuffix(ret, ".");
    ret = properSuffix(ret, "Mc");
    ret = properSuffix(ret, "Mac");

    return ret;
  }

  private string properSuffix(string word, string prefix) {
    if(string.IsNullOrEmpty(word)) return word;

    string lowerWord = word.ToLower(), lowerPrefix = prefix.ToLower();
    if (!lowerWord.Contains(lowerPrefix)) return word;

    int index = lowerWord.IndexOf(lowerPrefix);

    // If the search string is at the end of the word ignore.
    if (index + prefix.Length == word.Length) return word;

    return word.Substring(0, index) + prefix +
      capitaliseFirstLetter(word.Substring(index + prefix.Length));
  }

  private string capitaliseFirstLetter(string word) {
    return char.ToUpper(word[0]) + word.Substring(1).ToLower();
  }
}
1
ответ дан ljs 22 November 2011 в 07:26
поделиться
  • 1
    Спасибо, Вы - жизненное средство сохранения. Но zlib didn' t работают над моим Mac, таким образом, я должен был использовать abe.jar для извлечения. См. мой ответ stackoverflow.com/a/48077004/4747587 – Henry 3 January 2018 в 12:07

простой способ использовать для своей выгоды первую букву каждого слова (разделенный пространством)

$words = explode(” “, $string);
for ($i=0; $i<count($words); $i++) {
$s = strtolower($words[$i]);
$s = substr_replace($s, strtoupper(substr($s, 0, 1)), 0, 1);
$result .= “$s “;
}
$string = trim($result);

с точки зрения ловли примера "O'REILLY", который Вы дали разделению строки на обоих пробелах и, 'не будет работать, поскольку это использовало бы для своей выгоды любую букву, которая появилась после apostraphe т.е. s в Fred

, таким образом, я, вероятно, попробую что-то как

$words = explode(” “, $string);
for ($i=0; $i<count($words); $i++) {

$s = strtolower($words[$i]);

if (substr($s, 0, 2) === "o'"){
$s = substr_replace($s, strtoupper(substr($s, 0, 3)), 0, 3);
}else{
$s = substr_replace($s, strtoupper(substr($s, 0, 1)), 0, 1);
}
$result .= “$s “;
}
$string = trim($result);

, Это должно поймать O'Reilly, Час, O'Donnell и т.д. надеется, что это помогает

, обратите внимание, что этот код не тестируется.

0
ответ дан JimmyJ 22 November 2011 в 07:26
поделиться
  • 1
    @Henry, Как указано здесь на Mac можно сделать следующую команду: dd if=data.ab bs=24 skip=1 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > data.tar – Marc_Alx 8 March 2018 в 13:30

Вы не упоминаете, какой язык Вы хотели бы решение в том, таким образом, вот некоторый псевдо код.

Loop through each character
    If the previous character was an alphabet letter
        Make the character lower case
    Otherwise
        Make the character upper case
End loop
-1
ответ дан GateKiller 22 November 2011 в 07:26
поделиться

Существует также этот аккуратный сценарий Perl для заключающего в корпус заголовок текста.

http://daringfireball.net/2008/08/title_case_update

#!/usr/bin/perl

#     This filter changes all words to Title Caps, and attempts to be clever
# about *un*capitalizing small words like a/an/the in the input.
#
# The list of "small words" which are not capped comes from
# the New York Times Manual of Style, plus 'vs' and 'v'. 
#
# 10 May 2008
# Original version by John Gruber:
# http://daringfireball.net/2008/05/title_case
#
# 28 July 2008
# Re-written and much improved by Aristotle Pagaltzis:
# http://plasmasturm.org/code/titlecase/
#
#   Full change log at __END__.
#
# License: http://www.opensource.org/licenses/mit-license.php
#


use strict;
use warnings;
use utf8;
use open qw( :encoding(UTF-8) :std );


my @small_words = qw( (?<!q&)a an and as at(?!&t) but by en for if in of on or the to v[.]? via vs[.]? );
my $small_re = join '|', @small_words;

my $apos = qr/ (?: ['’] [[:lower:]]* )? /x;

while ( <> ) {
  s{\A\s+}{}, s{\s+\z}{};

  $_ = lc $_ if not /[[:lower:]]/;

  s{
      \b (_*) (?:
          ( (?<=[ ][/\\]) [[:alpha:]]+ [-_[:alpha:]/\\]+ |   # file path or
            [-_[:alpha:]]+ [@.:] [-_[:alpha:]@.:/]+ $apos )  # URL, domain, or email
          |
          ( (?i: $small_re ) $apos )                         # or small word (case-insensitive)
          |
          ( [[:alpha:]] [[:lower:]'’()\[\]{}]* $apos )       # or word w/o internal caps
          |
          ( [[:alpha:]] [[:alpha:]'’()\[\]{}]* $apos )       # or some other word
      ) (_*) \b
  }{
      $1 . (
        defined $2 ? $2         # preserve URL, domain, or email
      : defined $3 ? "\L$3"     # lowercase small word
      : defined $4 ? "\u\L$4"   # capitalize word w/o internal caps
      : $5                      # preserve other kinds of word
      ) . $6
  }xeg;


  # Exceptions for small words: capitalize at start and end of title
  s{
      (  \A [[:punct:]]*         # start of title...
      |  [:.;?!][ ]+             # or of subsentence...
      |  [ ]['"“‘(\[][ ]*     )  # or of inserted subphrase...
      ( $small_re ) \b           # ... followed by small word
  }{$1\u\L$2}xig;

  s{
      \b ( $small_re )      # small word...
      (?= [[:punct:]]* \Z   # ... at the end of the title...
      |   ['"’”)\]] [ ] )   # ... or of an inserted subphrase?
  }{\u\L$1}xig;

  # Exceptions for small words in hyphenated compound words
  ## e.g. "in-flight" -> In-Flight
  s{
      \b
      (?<! -)                 # Negative lookbehind for a hyphen; we don't want to match man-in-the-middle but do want (in-flight)
      ( $small_re )
      (?= -[[:alpha:]]+)      # lookahead for "-someword"
  }{\u\L$1}xig;

  ## # e.g. "Stand-in" -> "Stand-In" (Stand is already capped at this point)
  s{
      \b
      (?<!…)                  # Negative lookbehind for a hyphen; we don't want to match man-in-the-middle but do want (stand-in)
      ( [[:alpha:]]+- )       # $1 = first word and hyphen, should already be properly capped
      ( $small_re )           # ... followed by small word
      (?! - )                 # Negative lookahead for another '-'
  }{$1\u$2}xig;

  print "$_";
}

__END__

Но это походит надлежащим случаем, который Вы имеете в виду.. для имен людей только.

4
ответ дан user0042 22 November 2011 в 07:26
поделиться
  • 1
    Да. Барабанить. Я должен сделать это более ясным в моих документах. – hadley 29 June 2011 в 12:34

Kronoz, спасибо. Я нашел в Вашей функции что строка:

`if (!lowerWord.Contains(lowerPrefix)) return word`;

должен сказать

if (!lowerWord.StartsWith(lowerPrefix)) return word;

, таким образом, "informaciГіn" не изменяется на "InforMacIГіn"

лучше всего,

Enrique

0
ответ дан 22 November 2011 в 18:26
поделиться
  • 1
    Это работало на меня. Начиная с I' m использующий Windows, я должен был установить Cygwin и скопировать Ваши команды в .sh и выполнить .sh. И это работало безупречно. Спасибо. – Martin 26 April 2018 в 05:33

Я использую это как обработчик событий textchanged для текстовых полей. Поддержите запись "Макдональдс"

Public Shared Function DoProperCaseConvert(ByVal str As String, Optional ByVal allowCapital As Boolean = True) As String
    Dim strCon As String = ""
    Dim wordbreak As String = " ,.1234567890;/\-()#$%^&*€!~+=@"
    Dim nextShouldBeCapital As Boolean = True

    'Improve to recognize all caps input
    'If str.Equals(str.ToUpper) Then
    '    str = str.ToLower
    'End If

    For Each s As Char In str.ToCharArray

        If allowCapital Then
            strCon = strCon & If(nextShouldBeCapital, s.ToString.ToUpper, s)
        Else
            strCon = strCon & If(nextShouldBeCapital, s.ToString.ToUpper, s.ToLower)
        End If

        If wordbreak.Contains(s.ToString) Then
            nextShouldBeCapital = True
        Else
            nextShouldBeCapital = False
        End If
    Next

    Return strCon
End Function
0
ответ дан 28 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

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