2015-10-04 102 views
-1

對,所以我通過做一個基於文本的小型RPG遊戲來學習語言的想法,從而與C搞砸了。我遵循了我在Java中如何做類似遊戲的步驟,但採用了一些不同的解決方法,直到我得到輸出讓第一個字符串被我輸入的第二個字符串部分覆蓋的問題。這裏是問題發生的位置(我認爲)。C字符串保持相互覆蓋

struct character{ 
char firstname[100]; 
char lastname[100]; 
}; 

int main(){ 
    struct character charname; 

char first=charname.firstname[100]; 
char last=charname.lastname[100]; 

printf("And what do they call you?(First name)\n"); 
scanf("%s", &first); 


printf("Any other names?(Last name)\n"); 
scanf("%s", &last); 

printf("So you are called "); 
printf("%s ", &first); 
printf("%s ", &last); 

return 0; 
} 

我得到的輸出是:

什麼?他們叫你(的名字) 鮑勃

任何其他的名字(姓) 爾

?所以你叫BDole Dole

我不是BDole Dole,而是Bob Dole!

任何想法?

(剛剛意識到這裏的代碼輸入的事情是多麼可怕的)

+0

'char first = charname.firstname [100]; char last = charname.lastname [100];'你已經出界了。 –

回答

5

當你

char first=charname.firstname[100]; 

您從包含100個字符(記住,數組下標從零開始的)的陣列獲得字符101 。這僅僅是未定義的行爲

然後,通過使用&first使指針不進入數組,甚至不在數組之外,而是指向本地變量first在內存中的位置,將字符串寫入此位置將覆蓋堆棧,並導致非常嚴重的問題。

什麼你可能想要的是例如

char *first=charname.firstname; 

但是,甚至沒有必要,因爲陣列自然衰變爲指針,以他們的第一個元素,這意味着這是完全正確的:

scanf("%99s", charname.firstname); 

注意"%99s"格式,它告訴scanf不讀取超過99個字符,因此它不會超出所提供緩衝區的末尾。

+0

所以我最好的方法是從char first [charname.firstname [100]]中刪除[100]; ? –

+0

我真正想要做的就是使用C結構並將用戶輸入存儲在此例中的內存中。 –

0

前綴代碼與四個空格把它放在一個代碼塊。我通常使用我的編輯器來執行此操作,然後將其複製並粘貼到瀏覽器中。

這不會做你認爲它的作用:

char first=charname.firstname[100]; 
char last=charname.lastname[100]; 

你的意思做大概是什麼創造一個字符數組[100],就像您在Java中的「新」運營商。但是C不會那樣工作。結構定義告訴了「結構人物」中有兩個100字符的字符串的編譯器,所以當你寫

struct character charname; 

的空間,這兩個字符串被保留。在需要它之前,在堆棧上。它沒有初始化,但它在那裏,它屬於結構。

所以你可以通過調用scanf來填充這些數組。請注意,這裏不需要&或[];該數組被認爲在用於其值時被「衰減」爲指針。

scanf("%s", charname.first); 
/* later... */ 
scanf("%s", charname.last); 

但是,使用fgets()通常更智能 - 請參閱this C FAQ entry

另外,它看起來像你可能試圖學習C通過採取類似Java的代碼,並隨意修改,直到它編譯。這是行不通的,尤其是在C語言中。在某些語言中,通過監聽編譯器告訴你的內容,可以很好地瞭解什麼是合法的。但是C有一個比較弱的類型系統,所以它不能分辨出你什麼時候做什麼愚蠢的事情。獲取一本書並嘗試忘記Java告訴你的是什麼。

+0

阿歡呼隊友。在查看FAQ後,我意識到發生了什麼事情!非常感謝!!! –