C# 句子大写

C# 句子大写,c#,char,sentence,C#,Char,Sentence,我正在痛苦地尝试一项编程任务。我不是在找一个,这是你怎么做的,但更多的是我做错了什么 我试图从字符串输入中大写每个句子的开头。例如,字符串Hello。我叫约翰。我喜欢骑自行车。我会修改字符串并返回大写字母,例如:Hello。我叫约翰。我喜欢骑自行车。我的逻辑似乎有点错误,我很迷茫 到目前为止我所拥有的一切。基本上我所做的就是测试一个表示句子结尾的标点符号。然后尝试替换角色。还测试它是否位于字符串末尾,以避免创建IndexOutfrange异常。尽管如此,我得到的只是: private strin

我正在痛苦地尝试一项编程任务。我不是在找一个,这是你怎么做的,但更多的是我做错了什么

我试图从字符串输入中大写每个句子的开头。例如,字符串Hello。我叫约翰。我喜欢骑自行车。我会修改字符串并返回大写字母,例如:Hello。我叫约翰。我喜欢骑自行车。我的逻辑似乎有点错误,我很迷茫

到目前为止我所拥有的一切。基本上我所做的就是测试一个表示句子结尾的标点符号。然后尝试替换角色。还测试它是否位于字符串末尾,以避免创建IndexOutfrange异常。尽管如此,我得到的只是:

private string SentenceCapitalizer(string input)
    {
        for (int i = 0; i < input.Length; i++)
        {
            if (input[i] == '.' || input[i] == '!' || input[i] == '?')
            {
                if (!(input[i] == input.Length))
                {                       
                    input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
                }                     
            }
        }

        return input;

    }

非常感谢您的帮助。我只是在学习C,所以最基本的帮助就是服务。我知道的不多:P

您正在检查当前索引是否小于或等于字符串的长度,然后尝试进一步修改索引2

    if (!(input[i] == input.Length))
            {                       
                input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
            } 
应改为

    if (!((i + 2) >= input.Length))
            {                       
                input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
            } 

这将检查标点符号后2处是否有一个值。还可以使用>=而不是==因为你跳2,你可能会跳过数组的长度,其中==仍然返回false,但没有索引。

你正在检查当前索引是否小于或等于字符串的长度,然后尝试进一步修改索引2

    if (!(input[i] == input.Length))
            {                       
                input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
            } 
应改为

    if (!((i + 2) >= input.Length))
            {                       
                input.Replace(input[i + 2], char.ToUpper(input[i + 2]));  
            } 
这将检查标点符号后2处是否有一个值。也可以使用>=而不是==因为你跳2,你可能会跳过数组的长度,其中==仍然返回false,但没有索引。

而不是

if (!(input[i + 2] >= input.Length))
应该是

if (!(i + 2 >= input.Length))
您正在比较索引,而不是字符,而不是

if (!(input[i + 2] >= input.Length))
应该是

if (!(i + 2 >= input.Length))

您正在比较索引,而不是字符字符串是不可变的,您不能:

var str = "123";
str.Replace('1', '2');
你必须做到:

var str = "123";
str = str.Replace('1', '2');

字符串是不可变的,您不能执行以下操作:

var str = "123";
str.Replace('1', '2');
你必须做到:

var str = "123";
str = str.Replace('1', '2');

好的,其他人已经为您提供了一些停止明显错误的指针,但是我将尝试给您一些关于如何最好地实现这一点的想法

这是一个值得思考的三步过程

把字符串分成句子 确保每个标记的第一个字符为大写 通过将标记重新连接在一起来重建字符串 1我将留给您想象,但最终的想法是使用字符串数组,每个元素根据您的要求表示一个句子

2和

// Upercase character 0, and join it to everything from character 1 onwards
var fixedToken = token[0].ToUpper(CultureInfo.CurrentCulture) 
                              + token.Substring(1);
3也很简单

// reconstruct string by joining all tokens with a space
var reconstructed = String.Join(" ",tokens);

好的,其他人已经为您提供了一些停止明显错误的指针,但是我将尝试给您一些关于如何最好地实现这一点的想法

这是一个值得思考的三步过程

把字符串分成句子 确保每个标记的第一个字符为大写 通过将标记重新连接在一起来重建字符串 1我将留给您想象,但最终的想法是使用字符串数组,每个元素根据您的要求表示一个句子

2和

// Upercase character 0, and join it to everything from character 1 onwards
var fixedToken = token[0].ToUpper(CultureInfo.CurrentCulture) 
                              + token.Substring(1);
3也很简单

// reconstruct string by joining all tokens with a space
var reconstructed = String.Join(" ",tokens);

哦,好的,谢谢。超出范围的异常已消失。它不像预期的那样工作哈哈,我想回到绘图板上。哦,好的,谢谢。超出范围的异常已消失。它不像预期的那样工作哈哈,回到绘图板上我想。如果你有缩写s.O.L.I.D怎么办。或省略号。。。在你的文本中?如果你有缩写S.O.L.I.D怎么办。或省略号。。。在你的文本中?