你是如何通过终结角色突破循环的?

时间:2013-10-20 02:20:32

标签: c for-loop char

我正在尝试编写一个简单的演示程序,它将在输入指定字符时突破循环。我成功地做到了这一点,直到我想添加额外的条件,我没有超过我的阵列。当我输入指定的字符时,此代码不会突破循环,我无法弄清楚原因。代码的逻辑和设置似乎很合理!

#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。性格,但事实并非如此。谢谢你们

3 个答案:

答案 0 :(得分:2)

您正在输入字符之前测试条件,如果您使用do-while循环,则可以在

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

答案 1 :(得分:2)

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

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

循环条件的超复杂因素或多或少都不是一个好主意 - idx++迭代步骤在评估条件之前发生并且可能令人困惑。在循环中使用do / while或中断条件。

答案 2 :(得分:1)

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

#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;
}