C语言中的字符数组

3

我对C语言一窍不通,只是想尝试一些有趣的编程!我的第一个想法是创建一个井字棋游戏。在以下代码中,我正在尝试生成一个场地。它在某种程度上可以工作,但当我测试它时,条目feld[1][0]feld[2][0]为空。还有一件事我不明白的是,如果我在一个条目中保存了多个字母,例如xx,它会出现在其他地方。我猜这是C语言的存储空间分配问题。非常感谢任何反馈!

#include <stdio.h>
main()
{
  int i,j;
  char feld[3][3];
  for(j=0; j<3; j++)
  {
    for(i=0; i<3; i++)
    {
      printf("\t %2i. column %2i. row: ", i+1, j+1);
      scanf("%s", &feld[i][j]);
    }
  }
  for(j=0; j<3; j++)
  {
    for(i=0; i<3; i++)
    {
      printf("\t %c", feld[i][j]);
    }
    printf("\n");
  }
}

char数据单元只能存储一个字符,因此被称为char...如果你尝试将"xx"写入char中,它会溢出到下一个内存单元...而且这就是scanf(使用%s作为第一个参数)的特性,将输入的所有单元写入输出。 - Logan Murphy
3个回答

2

使用这行代码:

scanf("%s", &feld[i][j]);

你正在读取一个字符串(多个字符),并将它们放置在只应该有一个字符的位置。这会对附近存储的字符造成损坏。建议使用以下方法:

scanf("%c", &feld[i][j]);

每次只读取一个字符是一种解决方法。但这个方法也不完美,如果你输入了太多字符,它们会一直存储直到你再次尝试读取它们,这会导致一些奇怪的行为,比如打印多次而不等待你的输入:

2. column 1. row:     3. column 1. row:     1. column 2. row:  

正确答案取决于您希望同时输入多个输入时发生什么。


谢谢您在最后提到scanf有剩余数据。这样可以避免在此问题之后再次出现重复的问题。 :) - Cloud

1
以下是可用的代码。数组中的每个元素都是一个字符。%s用于扫描字符串而不是字符。你需要使用%c。在%c之前添加空格,以便scanf吃掉/吞咽空格和特殊字符。(比如enter)
#include <stdio.h>
main()
{
int i,j;
char feld[3][3];
for(j=0; j<3; j++)
{
    for(i=0; i<3; i++)
    {
        printf("\t %2i. Row %2i. Column:\n ", j+1, i+1);
        scanf(" %c", &feld[j][i]);
}
}
for(j=0; j<3; j++)
{
    for(i=0; i<3; i++)
    {
        printf("\t%c", feld[j][i]);
    }
    printf("\n");
}
}

谢谢,问题解决了!你能解释一下为什么空格会吞噬掉空白字符吗? - KingKonguKonga

0
首先,在您的代码中,“j”代表行,因此应该首先使用它,然后是“i”,就像feld[j][i]一样。 其次,char大小为1,因此我们只能存储单个字符,这就是为什么使用多个输入会出现问题的原因。
#include <stdio.h>
main()
{
int i,j;
char feld[3][3];
for(j=0; j<3; j++)
{
for(i=0; i<3; i++)
{
    printf("\t %2i. column %2i. row: ", i+1, j+1);
    scanf("%c", &feld[j][i]);
}
}
for(j=0; j<3; j++)
{
for(i=0; i<3; i++)
{
    printf("\t %c", feld[i][j]);
}
printf("\n");

} }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接