scanf后的变量复位

时间:2014-08-11 18:11:28

标签: c linux string gcc scanf

我写了以下函数:

typedef enum {GREEN,BLACK, WHITE} color;

void StartGame(Piece board[8][8])
{
    color currentPlayer=WHITE;
    char location[2];
    int gameover=1;
    while(gameover)
    {
        printf("%d\n",currentPlayer);

        if(currentPlayer==WHITE)
            printf(BOLDWHITE"White: Please select a piece:\n");
        else
            printf(BOLDBLACK"Black: Please select a piece:\n");

        printf("%d\n",currentPlayer);

        scanf("%s",location);

        printf("%d\n",currentPlayer);
        if(currentPlayer==WHITE)
            currentPlayer=BLACK;
        else
            currentPlayer=WHITE;

    }
} 

我在任何级别打印currentPlayer以查看正在进行的操作 - >在这里我得到了:

2
White: Please select a piece:
2
a1
0
2
White: Please select a piece:
2

为什么scanf之后当前玩家为0?我没碰过它。

3 个答案:

答案 0 :(得分:4)

缓冲区location只有2个字符的空间,而scanf会在结尾添加额外的NUL字符。因此,您有堆栈损坏问题。只需为location留出更多空间,例如:

char location[8];

修改

由于您只想阅读字符串,我建议您使用fgets,它允许您限制输入字符串中的读取字符数。因此,我的代码看起来像这样:

char location[8];
...
fgets(location, sizeof(location), stdin); //instead of scanf, fgets reads at most one less than buffer's size characters.

你只需要担心fgets在最后放置一个最终的终结字符(\n)这一事实,但如果你只是处理2个第一个字符,那么这不应该是一个交易。字符串。

答案 1 :(得分:0)

在字符数组位置输入字符串时,似乎覆盖了currentPlayer占用的内存。正如从控制台输出中看到的那样,您输入了字符串a1。要将它存储在数组位置,它应该以leat定义为

char location[3];

因为scanf会在输入的字符串后附加终止零。

如果你改用函数fgets会更好。

答案 2 :(得分:0)

您应该使用类似这样的内容:

sprintf(format, "%%%dX", sizeof(buffer));
fscanf(file, format, &buffer);