做而不做';Don’不要在第一天就辞职;q';

做而不做';Don’不要在第一天就辞职;q';,d,do-while,D,Do While,因此,我正在开发一个简单的基于文本的D语言小游戏,以获得一些使用该语言的经验。以下是我目前正在努力解决的do-while循环: do{ writeln("a. Advance 1 year\tc. Advance 10 years\tq. Quit"); writeln("b. Advance 5 years\td. Modify faction"); input = chomp(stdin.readln()); switch(input){ ... defa

因此,我正在开发一个简单的基于文本的D语言小游戏,以获得一些使用该语言的经验。以下是我目前正在努力解决的do-while循环:

do{
  writeln("a. Advance 1 year\tc. Advance 10 years\tq. Quit");
  writeln("b. Advance 5 years\td. Modify faction");

  input = chomp(stdin.readln());

  switch(input){
    ...
    default:
      break;
  }
  writeln(input[0]);
}while(input[0] != 'q');

现在我遇到的问题是,当我点击q并进入循环时,循环不会退出。它一直在继续。但是在第一次输入q之后,另一个q将终止循环。writeln在那里作为一个健全的检查,它打印出我键入的字符,与键入的字符完全相同。我觉得我快疯了,但这可能只是一个简单的o型或者你们会马上发现的东西。switch语句中没有任何内容修改“input”

编辑:好的,有些人一直要求查看所有代码。这是:


当我在switch modified input中什么也没说时,是为了隐藏我还没有在switch中写入任何内容的事实。在添加更复杂的内容之前,我一直在尝试让退出部分正常工作。另外,这里有一个我运行它的示例文件:

好的,我的朋友找到了。它与while循环本身无关。我一时忘了args[0]是程序的名称。所以它实际上是在没有任何东西的情况下运行父循环一次,然后实际退出,然后运行适当的循环。它是通过使父循环像这样来修复的

foreach(filename; args[1..$]){
    ...
    do{
        ...
    while(input[0] != 'q');
}
与之相反:

foreach(filename; args){

等等。

你能发布整个节目吗?这看起来很正确,但可能在其他地方或其他地方存在缓冲问题。将其粘贴到主循环中的行为与预期的一样。我会尝试在没有周围代码的情况下运行它,以向自己证明它是有效的,然后开始添加其他部分,直到它再次崩溃。或者只发布整个程序,以便我们可以更好地查看。如果某些缓冲区溢出对您的变量造成冲击,则“switch语句中的任何内容都不会修改‘input’”可能仍然是不真实的。我们说不出来。我还获取了代码,编译了它,它的工作方式和预期的一样,所以你很可能在代码的其他地方遇到了问题。好的,我将目前为止所有的代码粘贴到了一个粘贴箱中。以及我用来测试它的文件。文件I/O是否会干扰来自main不同部分的字符串?我对D很陌生,所以我不确定你们在说什么缓冲区,除非你们指的是输入缓冲区,但这不应该影响输入,对吗?