【问题标题】:Why is the char array empty after requesting another input from user?为什么在向用户请求另一个输入后 char 数组为空?
【发布时间】:2018-11-02 11:10:29
【问题描述】:

我正在用 C 语言开发井字游戏,但无法显示玩家的姓名。
每次玩家必须采取行动时,我都会显示“轮到你了,%s!”。
但是从第二次迭代开始,玩家名字是空的。

经过一些测试,我发现当我评论第 56 行时,问题不会发生。

控制台输出:

Starting...

Type your username (20 characters): Paulo

Type your username (20 characters): Edson


   A   B   C 
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, Paulo!

Choose a position (Ex.: B2, A0, etc): A2

Picked: A2


   A   B   C 
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, !

Choose a position (Ex.: B2, A0, etc): A3

Picked: A3


   A   B   C 
0 ___|___|___
1 ___|___|___
2 ___|___|___


It's your turn, !

Choose a position (Ex.: B2, A0, etc): ^C

这是我的代码:

#include <stdio.h>
#include <string.h>

void pickposition(char * position) {
  printf("\nChoose a position (Ex.: B2, A0, etc): ");
  scanf(" %2s", position);
}

void printtable(char table[3][3]) {
  printf("\n\n");

  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        char c = table[i][j];
        if (c != 'O' && c != 'X') {
            table[i][j] = '_';
        }
    }
  }

  printf("   A   B   C \n");
  printf("0 _%c_|_%c_|_%c_\n", table[0][0], table[0][1], table[0][2]);
  printf("1 _%c_|_%c_|_%c_\n", table[1][0], table[1][1], table[1][2]);
  printf("2 _%c_|_%c_|_%c_\n", table[2][0], table[2][1], table[2][2]);
  printf("\n\n");
}

void pickusername(char *name) {
  printf("\nType your username (20 characters): ");
  scanf("%20s", name);
}

int main() {
  printf("\nStarting...\n");
  char table[3][3];

  char player1[20];
  char player2[20];

  pickusername(player1);
  pickusername(player2);

  int next = 1;
  int counter = 0;
  while (1) {
    char nextname[20];
    printtable(table);
    if (next) {
        strcpy(nextname, player1);
    } else {
        strcpy(nextname, player2);
    }
    printf("It's your turn, %s!\n", nextname);

    char positionpicked[2];
    pickposition(positionpicked);
    printf("\nPicked: %s\n", positionpicked);

    counter--;
    if (counter == -20) {
        break;
    }
  }
}

PS.:我知道next 始终为 1,这只是一个草稿。

【问题讨论】:

  • 请不要发布文字图片,而是将文字作为文字发布。并在此处发布您的代码,而不是作为外部链接。您可以edit您的问题。另请阅读:How to Ask
  • 可能:posicaoescolhida[2]; -> posicaoescolhida[3];。 NUL 字符串终止符需要空间,请阅读 C 教科书中处理字符串的章节。其他地方可能还有更多问题。
  • 请始终粘贴代码并输出。我现在为你做了这个。下次请自己做。
  • C-"strings" 总是需要多一个字符,然后它们应该包含。它存储字符串结束标记,0-terminator。所以假设一个 20 个字符的缓冲区,那么这个 scanf("%20s", nome); 应该是 scanf("%19s", nome);
  • 向英语社区提供非英语“说”代码可能不是最佳选择。

标签: c arrays scanf tic-tac-toe


【解决方案1】:

当我运行您的程序时,它对我来说运行良好。但是positionpicked 数组的大小需要做一个小的修正。您要求用户输入两个字符(A0/B1),但 positionpicked 只有 2 个元素,这意味着没有分配的内存来存储 '\0'。所以positionpicked的大小应该增加到3。

这也可能是问题的原因(我不确定,但很可能会)因为这个 NULL 字符有可能会覆盖 player1[0]。

在第一次迭代期间:-

player1 -> Pablo0
player2 -> Edson0
positionpicked -> A20 /* Since positionpicked can only store 2 bytes the 0('\0')
                         is stored in the adjacent memory location */

在第二次迭代中:-

player1 -> 0ablo0    /* Which will print a null string */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2021-10-07
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多