0

指定された文字を入力するとループから抜け出す簡単なデモ プログラムを作成しようとしています。配列を超えないという追加の条件を追加するまで、これを正常に行うことができました。指定された文字を入力しても、このコードはループから抜け出せず、その理由がわかりません。コードのロジックとセットアップは正しいようです。

#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 と評価する必要があるようです。キャラクターですが、そうではありません。みんなありがとう

4

3 に答える 3

2

文字が入力される前に条件をテストしています。do-while ループを使用すると、後で比較を行うことができます。

idx = 0;
do
{
    scanf("%c\n", &input[idx]);
}
while( input[idx++] != breakout && idx < 10);
于 2013-10-20T02:25:30.687 に答える
2

for ループの条件について考えてみましょう。input[idx]配列内の次の位置 (まだ文字を含んでいない) を常に見ています。scanf 呼び出しから受け取った前の文字ではありませんinput[idx - 1]。しかし、もちろん、最初のイテレーションをチェックすることはできませんinput[idx - 1]ので、注意してください。

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

idx++条件の評価の前に反復ステップが発生し、混乱を招く可能性があるため、多かれ少なかれこの理由で、超複雑な for ループ条件はめったに良い考えではありません。do/while を使用するか、ループ内でブレーク条件を使用してください。

于 2013-10-20T02:27:01.563 に答える
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;
}
于 2013-10-20T03:00:32.170 に答える