2017-04-11 40 views
0

下面是一個名爲scrabble.c的程序的代碼片段,用於播放簡化版本的遊戲。用戶被分配了7個隨機字符,然後被告知使用這些字符輸入一個單詞。我遇到了用戶輸入並將其存儲在數組中的函數的問題。堆砌在Scrabble迷你遊戲程序中粉碎

此功能應該提示用戶輸入一個單詞,然後讀取它,並將它逐個字符地存儲在數組「字」中。該函數還應返回用戶輸入的單詞的大小(輸入的字母數)。

int read_word(char word[7], int max_size_word) 
{ 
int c = 0, input_count = 0; 
printf("Please enter your word : "); 

char user_input = getchar(); 
for(c = 0; c < max_size_word; c++) 
{ 
    if(user_input != '\n') 
    { 
    word[input_count] = user_input; 
    input_count++; 
    printf("input_count = %d, letter entered = %c\n", input_count, 
user_input); 
    } 
    else if(user_input == '\n') 
    { 
    return input_count; 
    } 
    user_input = getchar(); 
} 
return input_count; 

//在這裏發生錯誤。錯誤:堆棧溢出檢測./scrabble終止中止核心轉儲「

爲什麼砸被檢測堆棧

} 

int main(void) 
{ 
int t; 
int letter_set[7] = {0}; 
char word[7]; 
int size_letter_set = 100; 
int num_letters = 7; 

generate_letter_set(&letter_set[7], size_letter_set, num_letters); 
read_word(&word[7], 7); 
printf("printing word : "); 

for(t=0; t < 7; t++) 
{ 
    printf("%c", word[t]); 
} 
    printf("\n"); 


return 0; 
} 

回答

1

你調用函數與兩個:?

&letter_set[7] 
&word[7] 

這是一個指向第7個int /字符數組中的第8個int /字符在調用函數時只需使用letter_setword當代碼開始寫入數組時,您的堆棧可能會被破壞類似地,函數原型會更好:

int read_word(char word[], int max_size_word) 

7在這裏沒有做任何特別的事,所以放下它。

1

的問題是在這裏

read_word(&word[7], 7); 

要傳遞到read_word不是數組大小7 word你可能已經想到了地址,但word[7]指向的word的字符地址這是超出邊界的。

要通過陣列地址寫:

read_word(&word[0], 7); 

read_word(word, 7); 

同樣是關於generate_letter_set(&letter_set[7], size_letter_set, num_letters);