【问题标题】:How do you break out of a loop by a terminating character?你如何通过终止字符打破循环?
【发布时间】:2013-10-28 16:31:41
【问题描述】:

我正在尝试编写一个简单的演示程序,该程序将在输入指定字符时跳出循环。我能够成功地做到这一点,直到我想添加我没有超过我的数组的额外条件。当我输入指定的字符时,这段代码不会跳出循环,我不知道为什么。代码的逻辑和设置似乎很合理!

#include <stdio.h>

char input[10];
char breakout = '!';
int idx;

int main(void)
{
printf("Input characters until %c character is used to break out", breakout);

for(idx = 0; input[idx] != breakout && idx < 10; idx++)
{
    scanf("%c", &input[idx]);
}

printf("Program terminated:");

getchar();
return 0;   
}

似乎 for 循环的条件在输入 '!' 时应该评估为 false性格,但事实并非如此。谢谢大家

【问题讨论】:

  • 初始化input 否则你将在第一次循环测试后访问垃圾值

标签: c for-loop char


【解决方案1】:

你是在输入字符之前测试条件,如果你使用do-while循环你可以在之后进行比较

idx = 0;
do
{
    scanf("%c\n", &input[idx]);
}
while( input[idx++] != breakout && idx < 10);

【讨论】:

  • 感谢您的帮助@Musa,但是我尝试使用您建议的调整,当我使用突破字符时它仍然没有突破循环。可能是……我的编译器?
  • 太棒了。那解决了它。我将把我的最佳答案更改为谁能回答我在代码中遇到的其他困境。我的数组大小为 10。当我执行我的代码时,它只允许我在代码终止之前输入 5 个输入(数组大小的一半)。所以我尝试将数组大小更改为 20。然后我能够输入 10 个输入(同样是数组大小的一半)。为什么是这样?我认为“指针/数组”算法不允许这样做。
  • @SmithWillSuffice 你是否在不止一个地方增加了idx
  • 没有 Musa,我发誓,我发布的代码是我使用的。当我实施你们提供的建议时,我一字不差地做到了。但是每当我运行代码时,在我输入 5 个字符后,它就会跳出循环并终止程序。你试过运行它吗?
  • @SmithWillSuffice 您也选择了输入字符,请参阅更新的答案
【解决方案2】:

您应该在输入字符后测试条件。我修改了你的代码:

#include <stdio.h>
char input[10];
char breakout = '!';
int idx;

int main(void)
{
    printf("Input characters until %c character is used to break out", breakout);

    for(idx = 0; idx < 10; idx++)
    {
            scanf("%c", &input[idx]);
            if(input[idx] == '!')
              break;
    }
    printf("Program terminated:");

    getchar();
    return 0;
}

【讨论】:

  • 感谢您的帮助。但是代码只允许我输入 5 个字符,而不是 10 个才终止?数组设置为 10,所以为什么只允许 5 个输入没有意义?我真的很难过。
  • 这个问题是缓冲区没有被清除。您可以在scanf(getchar)语句之前添加以下代码:如果您的操作系统是Linux :__fpurge(stdin);它将清除缓冲区。注意:fpurge 之前有两个“_”。你应该包括 ;如果你的操作系统是 windows : fflush(stdin);
【解决方案3】:

想想你的 for 循环条件。您的input[idx] 始终查看数组中的下一个位置(其中不包含字符)——而不是从 scanf 调用接收到的前一个字符,它可以在input[idx - 1] 找到。但是当然你不能在第一次迭代时检查input[idx - 1],所以要小心。

for(idx = 0; (idx == 0 || input[idx - 1] != breakout) && idx < 10; idx++) 
{    
  ... 
}

由于或多或少的原因,超级复杂的 for 循环条件很少是一个好主意 - idx++ 迭代步骤发生在条件评估之前,它可能会造成混淆。在循环中使用 do/while 或中断条件。

【讨论】:

  • 感谢您的回复。我需要进一步解释,因为我对如何评估 for 循环条件的理解显然存在缺陷。我认为检查会检查 input[idx] 而不是 input[idx -1]。
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2021-06-05
相关资源
最近更新 更多