-3

これは、私の場合は問題にならないので、なぜこれが起こっているのかという好奇心からです。無効な数字を入力すると、繰り返しラベルに適切に移動し、もう一度数字を入力するように求められますが、「f」のような文字を入力すると、無限にループして停止しません。どうしてこれなの?

ここの配列とすべての変数は int 型です。

    repeat: 
    printf("Enter number of available space, you are %c: ", userXO);
    scanf("%d", user);

    switch (*user)
    {
        case 1: if (spaces[0][0] == 49){ spaces[0][0] = userXO;}else goto repeat; break;
        case 2: if (spaces[0][1] == 50){ spaces[0][1] = userXO;}else goto repeat; break;
        case 3: if (spaces[0][2] == 51){ spaces[0][2] = userXO;}else goto repeat; break;
        case 4: if (spaces[1][0] == 52){ spaces[1][0] = userXO;}else goto repeat; break;
        case 5: if (spaces[1][1] == 53){ spaces[1][1] = userXO;}else goto repeat; break;
        case 6: if (spaces[1][2] == 54){ spaces[1][2] = userXO;}else goto repeat; break;
        case 7: if (spaces[2][0] == 55){ spaces[2][0] = userXO;}else goto repeat; break;
        case 8: if (spaces[2][1] == 56){ spaces[2][1] = userXO;}else goto repeat; break;
        case 9: if (spaces[2][2] == 57){ spaces[2][2] = userXO;}else goto repeat; break;
        default: goto repeat; break;
}
4

2 に答える 2

5

scanf("%d", user);数値の読み取りを試み、char( f) を見つけ、それをバッファに残して終了します。その後、ループはループしてscanf("%d", user);再び実行されます。そしてまた...

于 2013-04-21T01:21:34.883 に答える
2

これがあなたがしたことを私がどのように書いたかです:

int rc, user;
char buf[100];

for (;;)  // repeat until explicitly broken out of
{ 
    printf ("Enter number of available space; you are %c: ", userXO);
    if (!fgets (buf, sizeof buf, stdin))  /* end of file or i/o error? */
        break;

    rc = sscanf(buf, "%d", &user);
    if (rc != 1)   /* other than one parsed input item is an error */
    {
        printf ("invalid number; try again\n");
        continue;
    }

    /*
     * this switch has the odd property of potentially
     * doing all 9 cases for case 1,  8 cases for case 2, etc.
     * Maybe explicit breaks for success are needed?
     */
    switch (user)
    {
    case 1: if (spaces[0][0] == 49) spaces[0][0] = userX0; else continue;
    case 2: if (spaces[0][1] == 50) spaces[0][1] = userX0; else continue;
    case 3: if (spaces[0][2] == 51) spaces[0][2] = userX0; else continue;
    case 4: if (spaces[1][0] == 52) spaces[1][0] = userX0; else continue;
    case 5: if (spaces[1][1] == 53) spaces[1][1] = userX0; else continue;
    case 6: if (spaces[1][2] == 54) spaces[1][2] = userX0; else continue;
    case 7: if (spaces[2][0] == 55) spaces[2][0] = userX0; else continue;
    case 8: if (spaces[2][1] == 56) spaces[2][1] = userX0; else continue;
    case 9: if (spaces[2][2] == 57) spaces[2][2] = userX0; else continue;
    default: continue;
    }
    break;  /* if valid case(s) taken, exits loop */
}

ご覧のとおり、ラベルや goto は必要ありません。また、コードはよりコンパクトです。

于 2013-04-21T01:56:44.887 に答える