1

我正在悲惨地尝试编程任务。我不是在寻找“这就是你这样做的方式”,而是更多的是“我做错了什么?”

我正在尝试将字符串输入中每个句子的开头大写。例如字符串“你好。我的名字是约翰。我喜欢骑自行车。” 我会修改字符串并用大写字母返回它,例如:“你好。我的名字是 john。我喜欢骑自行车。” 我的逻辑似乎有点缺陷,我很迷茫。

到目前为止我所拥有的。基本上我所做的只是测试表示句子结尾的标点符号。然后尝试替换字符。还测试它是否在字符串的末尾以不创建 IndexOutOfRange 异常。虽然,这就是我得到的全部:(

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

4

4 回答 4

3

代替

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

它应该是

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

您正在比较索引,而不是字符

于 2013-03-19T06:32:56.873 回答
1

字符串是不可变的,你不能这样做:

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

你所要做的:

var str = "123";
str = str.Replace('1', '2');
于 2013-03-19T07:02:47.627 回答
1

您正在检查当前索引是否小于或等于字符串的长度,然后尝试进一步更改索引 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 但没有索引。

于 2013-03-19T06:20:28.267 回答
0

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

值得将其视为一个 3 步过程

  1. 将字符串标记为句子
  2. 确保每个标记的第一个字符是大写的
  3. 通过将标记重新组合在一起来重建字符串

(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);
于 2013-03-20T16:48:25.740 回答