Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将代码C中的每三个字符大写?_C#_String_Toupper - Fatal编程技术网

C# 如何将代码C中的每三个字符大写?

C# 如何将代码C中的每三个字符大写?,c#,string,toupper,C#,String,Toupper,我正在学习C语言,但有些东西让我很沮丧。我正在学习字符串方法及其工作原理 public static void CaseFlip() { Console.WriteLine(" CaseFlip -- Output"); Console.WriteLine("============================================================================

我正在学习C语言,但有些东西让我很沮丧。我正在学习字符串方法及其工作原理

public static void CaseFlip()
        {
            Console.WriteLine("             CaseFlip -- Output");
            Console.WriteLine("==============================================================================");


           for (int i = 0; i < text.Length; i ++)
           {
            char[]delimiters = {'/'};
            string[]splitString = text.Split(delimiters);


                for (int k  = 0; k < splitString.Length; k +=3)
                    {
                    string sub = text.Substring(0);
                    string remove = sub.Remove(4, text.Length);
                    string insert = remove.Insert(0, sub);

                    splitString[k] = splitString[k].ToUpper();
                    Console.WriteLine(splitString[k]);
                    }
           }
           Console.WriteLine(" ");

        }
怎么办?

不需要先进行循环;单个循环应该迭代文本中的分隔符数量。 此外,您将在这一行中得到一个异常

string remove = sub.Remove(4, text.Length);
因为您正试图通过删除整个文本的一部分来创建新字符串,从第4个字符开始,使用与text.Length一样多的字符-实际上超出了范围。 试试这个:

public static void CaseFlip(string text)
{
    Console.WriteLine("             CaseFlip -- Output");
    Console.WriteLine("==============================================================================");

    char[] delimiters = { '/' };
    string[] splitString = text.Split(delimiters);
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < splitString.Length; i++)
    {
        char[] charsInLine = splitString[i].ToCharArray();

        for (int k = 0; k < charsInLine.Length; k++)
        {
            sb.Append(k % 3 == 0 ? char.ToUpper(charsInLine[k]) : charsInLine[k]);
        }
        sb.Append(' ');
    }

    Console.WriteLine(sb.ToString());
    Console.WriteLine(" ");
}

你应该考虑使用String Bu建器类来进行这样的字符串操作。要使用它,只需将using System.Text添加到文件顶部。

您可以使用Substring选择要转换为大写的字符,然后使用Remove从字符串中删除该原始字符,然后使用Insert将大写字符添加回。因为字符串是不可变的,所以还需要将中间步骤存储在变量中,以便将更改转入下一个周期

公共静态无效案例翻转 { Console.WriteLine CaseFlip-输出; 控制台。写入线==========================================================================================================================================================================================================================================================================================================================================================================================================; var splitString=text.Split'/'; 对于变量i=0;i字符串是不可变的。调用SubString、Remove和Insert每次都会创建一个新字符串,并且不会使用内存

要实现您的要求,一个简单的方法是使用tocharray将字符串转换为char数组,然后使用简单的for循环进行迭代。在循环内部,您可以检查该位置的字符是否同时是字母和大于或等于97。小写字母从97开始

要将小写字母转换为大写字母,只需从字母中减去32即可。由于您正在修改字符数组,因此不会在内存中创建任何新字符串

完成大小写后,可以使用字符串构造函数之一再次将字符数组转换为字符串

var chars = text.ToCharArray();
for (int i = 0; i < chars.Length; i += 3)
{
    if (char.IsLetter(chars[i]) && chars[i] >= 'a')
        chars[i] = (char)(chars[i] - 32);
}

text = new string(chars);

以下是我对此的看法:

string text =
    "You only have one chance to make a first impression/" +
    "Consider the source and judge accordingly/" +
    "You can do something for a day you can't imagine doing for a lifetime/" +
    "Are we not drawn onward, we few, drawn onward to new era/" +
    "Never odd or even/" +
    "Madam, I'm Adam/" +
    "What do you mean? It's not due tomorrow, is it?";

string result = new string(
    text
        .Select((c, i) => i % 3 == 0 ? char.ToUpper(c) : c)
        .ToArray());
你只有一次机会给人留下第一印象/考虑来源并做出相应判断/你可以做一件你一辈子都无法想象的事情/我们不是在前进吗,我们很少,在新时代前进/从不奇数或偶数/夫人,我是亚当/你是什么意思?明天不到期,是吗


好的,很酷。但是,如何将字符串数组中的每三个字符大写?例如,我试图复制:你只有一个机会,第一个印象,考虑来源和判断,因此你可以做一天,你不能想象做一辈子,我们不向前,我们很少,吸引到新的时代从来没有奇怪,甚至夫人,我是亚当是什么意思?明天还没到期,是吗?啊,很抱歉没有准确回答这个问题。我已经更新了代码。您也可以考虑使用StringBuilder,正如我在代码中所做的那样,如果您打算稍后重用该输出,而不只是将其输出到控制台。代码中还有更多的内容,然后简单地将每第三个字母大写。你能将示例代码简化为问题所指的代码吗?@LorenPechtel-我想知道先学习LINQ是什么感觉。也许会更好。我的意思是,我从Commodore Basic和6502机器代码开始,我不希望这些基础知识在现在的人们身上出现。当LINQ工作时,它很好。如果没有,调试是一件非常痛苦的事情。当你改变某些东西并破坏它时,调试是一件非常痛苦的事情。因为这个原因,我很少使用它。@LorenPechtel-这里有不同的视角很有趣。我使用LINQ的原因之一是因为它不太可能首先创建错误代码。通常它会创建清晰的线性代码,这很容易推理。我同意@LorenPechtel的观点,即调试非常困难,虽然它看起来好得多,而且肯定会让程序员对自己能够在几行代码中表达多个代码块“感觉良好”:但我也认为,对于刚开始使用字符串的人来说,这是一个有点太高级的主题。
string text =
    "You only have one chance to make a first impression/" +
    "Consider the source and judge accordingly/" +
    "You can do something for a day you can't imagine doing for a lifetime/" +
    "Are we not drawn onward, we few, drawn onward to new era/" +
    "Never odd or even/" +
    "Madam, I'm Adam/" +
    "What do you mean? It's not due tomorrow, is it?";

string result = new string(
    text
        .Select((c, i) => i % 3 == 0 ? char.ToUpper(c) : c)
        .ToArray());