【问题标题】:Adding input to a string with a max of 10 words C#将输入添加到最多包含 10 个单词的字符串 C#
【发布时间】:2020-02-16 16:43:02
【问题描述】:

我正在为我的学习创建一个简单的程序。在这个程序中,我需要造一个 10 个单词的句子。在最后一次输入之后,我想让它停止。所以我尝试的是这样的: 创建一个名为 textt 的空字符串,使用一个 while 循环,因为我让它始终为真,它将继续,创建一个字符串,其分配显示在程序中给用户 aSentence 它被调用,取一个名为 count 的 int 并给它值0,然后我开始我的 for 循环我使用 for 循环因为我可以添加一个条件和迭代器,所以它会停止,当然还有初始化程序。

在for循环中我:打印出aSentence(用户会读到这个),我放了一个叫input的字符串,让用户输入一个单词(我是初学者,不知道怎么做如果用户输入两个单词但现在不是分配错误),我输入字符串 textt 因为它们是不可变的但不在此处,我添加“”以创建空白空间,当然还有输入。然后我打印出用户写下的文本,并用 i++ 递增(如果我说得对的话)。

然后我开始一个 if 语句,它说如果我(见我的 for 循环)等于 == 到 9,因为我在我的 for 循环中增加它应该打印出句子的结尾,显示整个文本然后中断.

但是由于某种原因,每次输入内容时循环都是无限的。当循环应该在 9 点结束时,句子的结尾会不时出现。 我的问题是如何解决这个问题,以确保当用户输入 10 个单词时句子结束,并且句子的结尾恰好在 10 个输入单词处弹出。

using System;

namespace Opgave_10_woorden_invoegen_in_1_string_plakken
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create a program that stops after input of 10 words
            string textt = "";
            while (true)
            {
                string aSentence = new string("We are making a sentence of 10 words.");
                int count = 0;
                for (int i = 0; i < 9; i++)
                {
                    Console.WriteLine(aSentence);
                    string input = Console.ReadLine();
                    textt = textt + " " + input;
                    Console.WriteLine(textt, i++);
                    if (i == 9)
                    {
                        Console.WriteLine("End of the sentence", textt);
                        break;
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • while(true) 将永远运行(除非某些代码调用 break)。您的内部 for 循环应该可以正常工作 - 为什么不直接删除 while 循环?
  • 另外,您不需要为字符串赋值调用字符串构造函数(这甚至可以编译吗?)。直接赋值字符串即可:string aSentance = "We are making a sentence of 10 words.";
  • 还有一个问题是您将i 递增两次:一次在for 语句迭代器中,另一次在for 循环体中,所以i 将变为@ 987654332@ 仅 5 次迭代。删除内部增量。
  • 并且你的 for 循环条件应该是 &lt; 10,因为你想要 10 项目并且计数从 0 开始。而且您不需要在for 循环中使用break 语句,因为条件是在for 语句中内置的。
  • 如果你学习how to debug programs,你的学习会更好。

标签: c# string for-loop if-statement increment


【解决方案1】:

将我的 cmets 组合成一个答案:

  1. while(true) 将永远运行(除非某些代码调用 break)。您的内部 for 循环应该可以正常工作 - 为什么不直接删除 while 循环?

  2. 并且你的 for 循环条件应该是 &lt; 10,因为你想要 10 项目并且计数从 0 开始。而且您不需要在for 循环中使用break 语句,因为条件是内置在for 语句中的。

  3. 1234563 @ 迭代。删除内部增量。请参阅for 声明文档here
  4. 另外,您不需要为字符串赋值调用字符串构造函数(甚至可以编译吗?)。直接赋值字符串即可:string aSentance = "We are making a sentence of 10 words.";

  5. 最后,您可以查看Console.WriteLine 的文档。您传递给它的第二个变量可能不是您认为的那样。

将这一切放入一个示例中:

static void Main()
{
    //Create a program that stops after input of 10 words
    string textt = "";
    string aSentence = "We are making a sentence of 10 words.";

    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(aSentence);
        textt = textt + " " + Console.ReadLine();
        Console.WriteLine(textt);
    }

    Console.WriteLine("End of the sentence");
    Console.ReadKey();
}

【讨论】:

  • 非常感谢 :) 它帮助了我作为初学者,因为我需要理解这种语言。
【解决方案2】:

while (true) 声明意味着你的循环永远运行。

您正试图通过使用break 来摆脱这种情况。但由于这是在内部 for 循环中执行的,因此它只会跳出该内部循环,而不是您的外部 while 循环,这是您想要和期望的。

您不需要外部的 while 循环,因此只需将其删除即可解决问题。

如果您想要 10 个输入,那么您还需要更改您的 for 循环以运行 10 次迭代,而不是您目前的 9 次。

另外,你应该在多次连接字符串时使用 StringBuilder 类,因为它更有效。 详情请见:https://www.dotnetperls.com/stringbuilder

【讨论】:

  • StringBuilder 在这种情况下不会有任何明显的不同。请参阅:the sad tragedy of micro optimization theater 了解更多信息!
  • 我同意在这种情况下这不是问题,并且可以尝试进行不必要的优化,但是随着他的学习,StringBuilder 是一个值得学习的好课程,有助于尽早采用良好的实践更容易粘在哪个上面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2021-02-23
  • 2021-08-22
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多