在此代码中找不到正确的输出

时间:2018-11-10 13:35:52

标签: c loops if-statement scanf

我被要求写一个关于行人的程序。 程序方向:


  1. 假设一个人(例如,A)站在(0,0)处,等待用户给他指示方向和距离。

  2. 用户可以输入N E W S来表示北,东,西,南以及距离的任何值。

  3. 当用户输入0作为方向时,停下来并打印出该人停下的位置

我的代码:

X = initial(4) // X should be : 1111
Y = solution(X, 2) // Y should be 1101
Z = solution(Y, 3) // Z should be 1001

但是当我在前两个输入之后运行程序时,它将在有效输入中打印无效输出。

输出:enter image description here

2 个答案:

答案 0 :(得分:0)

这是OR与AND的经典错误。 应该是

if(dir != 'N' && dir != 'S' && dir != 'E' && dir != 'W') . 

例如,如果用户输入“ N”,则在这种情况下,if语句仍将返回成功,因为它的!=“ S”且if条件具有OR。

编辑:(按照@ usr2564301的建议。)

在scanf输入%c之前添加一个空格。

scanf(" %c",&dir);

Check link for more explanation.

答案 1 :(得分:0)

因此,我发现了您的问题:在输入“英里”后按“ Enter”键时,“ Enter”被注册为输入,为'\ n'字符。我在这里为您提供了一个解决方案,但是如果您不喜欢它,只需做一个特殊的情况即可忽略'\ n'字符。类似于else if (dir == '\n') continue;。我怀疑这可能是问题所在,但我在打印出“无效字符”后就确认了这一点。

int main() 
{

    float x = 0, y = 0;
    char dir;
    float mile;

    do 
    {

        printf("Enter input direction as N,S,E,W (0 to exit): ");
        scanf("%c", &dir);

        switch (dir)
        {

        case 'N':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            y += mile;
            break;
        case 'S':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            y -= mile;
            break;
        case 'E':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            x += mile;
            break;
        case 'W':
            printf("Input mile in %c dir: ", dir);
            scanf("%f", &mile);
            x -= mile;
            break;
        case '\n':
            break;
        case '0':
            break;
        default:
            printf("Invalid Direction, re-enter; You entered: %c \n", dir);
            break;
        }

    }while (dir != '0');

    printf("\nCurrent position of A: (%4.2f, %4.2f)\n", x, y);

    return 0;
}