c - C 中的 Scanf 导致奇怪的控制台行为?

标签 c console scanf

我知道 scanf 很糟糕,但我们不会对此测试无效输入(假设始终有效)。但是,当我调用具有 scanf 调用的 promptPlayer() 时,到控制台的输出停止(这没有意义,因为所有输出都应该在控制台中甚至调用scanf 之前。输入应该是一组由空格分隔的坐标(如输出所示)。

这是代码(重要的东西):

奥赛罗.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "othello_engine.h"

int main(int numArgs, const char *args[]) {

    // -------------------------- Initialize the Othello routine --------------------------- //

    // Create the board
    int size = atoi(args[2]);
    char board[size][size];

    // Display game start message
    if (args[4][0] == 'B' || args[4][0] == 'b')
        printf("Othello game with a %dx%d board - Player %d with black disc to start\n\n", size, size, atoi(args[3]));
    else
        printf("Othello game with a %dx%d board - Player %d with white disc to start\n\n", size, size, atoi(args[3]));

    // Initially display the game board
    displayBoard(size, size, board);

    // --------------------------- Start the game through user input --------------------------- //

    Coordinate placed = promptPlayer(1);

    printf("Place at [%d,%d].\n", placed.x, placed.y);

    Coordinate placed2 = promptPlayer(1);

    printf("Place at [%d,%d].\n", placed2.x, placed2.y);

    return EXIT_SUCCESS;
}

othello_engine.c

#include "othello_engine.h"
#include <stdio.h>

void displayBoard(int size, int size2, char board[size][size2]) {

    // Print the column numbers
    printf(" ");
    for (int i = 0; i < size; i ++) {
        printf(" %d", (i+1));
    }
    printf("\n");

    // Print the rest of the matrix, including row numbers
    for (int i = 0; i < size; i ++) {
        printf("%d", (i+1));
        for (int j = 0; j < size2; j ++) {
            if (board[i][j] != 'B' && board[i][j] != 'W') printf(" -");
            else printf(" %c", board[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");
}

Coordinate promptPlayer(int player) {

    Coordinate desiredLocation;
    printf("Player %d's turn (enter row and column): ", player);
    scanf("%d %d", &desiredLocation.x, &desiredLocation.y);
    //scanf("%*[^\n]%*c");

    return desiredLocation;
}

最后,othello_engine.h

#ifndef OTHELLO_ENGINE_H_
#define OTHELLO_ENGINE_H_

typedef struct {
    int x;
    int y;
} Coordinate;

#endif /* OTHELLO_ENGINE_H_ */

/*
 * Displays the Othello board and row/column numbers.
 */
void displayBoard(int size, int size2, char board[size][size2]);

Coordinate promptPlayer(int player);

这里是输出: 基本上,整个程序的输出流会停止,直到所有 scanf 都被求值。我不知道是什么原因造成的。

1 2 // This is the first scanf input
3 4 // This is the second set
Othello game with a 6x6 board - Player 1 with black disc to start

  1 2 3 4 5 6
1 - - - - - -
2 - - - - - -
3 - - B W - -
4 - - W B - -
5 - - - - - -
6 - - - - - -


Player 1's turn (enter row and column): Place at [1,2]. // Here is where the first scanf's values are output
Player 1's turn (enter row and column): Place at [3,4]. // Here is the second set

这真的没有任何意义。在调用 promptPlayer 方法之前,一切都完美地打印出来 - 值被正确接收,所以我没有真正看到问题......似乎 scanf 停止控制台输出(神奇地?)直到输入值 - 然后它会立即将所有内容打印到控制台。我只知道这是非常明显的事情。

最佳答案

我已经运行了一小段您的代码 promptPlayer,在我看来,您的代码没有任何实际错误,它正在执行预期的操作。我认为这是您的代码之外的问题,可能是您正在使用的编辑器及其与控制台的交互,例如 EclipseMintty

尝试在编辑器工具之外运行已编译的 exe,看看是否遇到同样的问题。

假设它与上面类似,然后添加以下代码来刷新输出也可以解决问题:

    Coordinate desiredLocation;
    printf("Player %d's turn (enter row and column): ", player);
    fflush(stdout);
    scanf("%d %d", &desiredLocation.x, &desiredLocation.y);

关于c - C 中的 Scanf 导致奇怪的控制台行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18970872/

相关文章:

c - printf scanf 执行顺序正在交换

c - 底数大于10的C扫描

我可以在 scanf 中放入 for 循环吗?

c++ - 完成后关闭线程

c - (const T v) 在 C 中从来都不是必需的,对吗?

c++ - 将单词拆分为两个字节的最快方法

c - c语言创建静态变量时

Java:更容易 pretty-print ?

JavaScript:未命中 "Uncaught SyntaxError"[Chrome]

linux - 使用 bash 打开和保存更改