2014-11-04 22 views
3

我都是C新手,只是想尝试一些编程以获得乐趣!我的第一个想法是创建一个Tic-Tac-Toe游戏。在下面的代码中,我试图生成一个字段。它在一定程度上起作用,但是当我测试它时,条目feld[1][0]feld[2][0]是空的。另外我不明白的是,如果我在一个条目中保存了更多的一个字母,例如xx,它就会在其他地方出现。我猜测这是C的节省空间分配问题。很高兴为任何反馈!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"); 
    } 
} 
+0

char数据单元只能存储一个字符因此被称为焦炭......如果你尝试“XX”写入字符就会溢出到下一个存储单元...再加上这就是'scanf'的特性(以'%s'作为第一个参数)将所有单元格从输入写入输出 – 2014-11-04 18:08:01

回答

2

这一行:

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

你正在阅读的字符串(多个字符),并把他们在那里应该只有一个字符。 这会对附近存储的字符造成伤害。 使用类似于:

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

每次只能读取一个字符。 但这种方法也不是完美的,因为现在如果你喂太多的字符,他们将继续保存,直到你再次尝试阅读它们,这会导致一些奇怪的行为,如打印多次,而无需等待您的输入:

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

如果您一次输入多个输入,正确答案取决于您想要发生的情况。

+0

谢谢,因为在'scanf'的末尾包含有剩余数据的位。在此之后保存另一个重复问题。 :) – DevNull 2014-11-04 19:13:00

1

以下是工作代码。数组中的每个元素都是一个字符。 %s用于扫描字符串而不是字符。您需要使用%c%c之前scanf的吃/狼吞虎咽的空格和特殊字符添加的空间。(如输入)

#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"); 
} 
} 
+0

谢谢你解决了我的问题!你能向我解释为什么空间吞噬了空白空间吗? – KingKonguKonga 2014-11-05 15:59:36

+0

http://linux.die.net/man/3/scanf – Gopi 2014-11-05 16:02:52

0

都在你的代码“J”首先是代表一行所以它应该是第一个和我应该像菲尔德之后[j] [i] 第二个字符大小是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"); 

}}