2014-11-04 53 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"); 

}}