2014-01-06 35 views
2

我在一個基本的C編程課程,我試圖創建一個hang子手遊戲。在過去的三個小時裏,我一直困擾着一個問題,而且我沒有明智的做法。將函數中的單詞複製到C中帶有strcpy的字符串中?

基本上,我創建了一個函數,它從文本文件中讀取一個隨機行,然後將其複製到一個字符串中。之後,我想將該字符串複製到函數外的另一個字符串。這是因爲主遊戲應該是完全用函數構建的。

這是從文本文件,並將其複製到一個字符串中讀取一個隨機單詞的功能:

char datorns_val() 
{ 
    char ordlista[20]; 
    char valt_ord[20]; 
    int raknare = 0; 


    srand(time(NULL)); 
    random = rand()%10+0;   

    ptr_file =fopen("hangman.txt","r"); 
    if (!ptr_file) 
    { 
    return 1; 
    } 

    while (fgets(ordlista,20, ptr_file)!=NULL) 
    { 
    raknare++; 
    if (raknare == random) 
     strcpy(valt_ord, ordlista); 
    } 

    return valt_ord; 
} 

此步驟完成後,我想複製位於valt_ord另一串詞,就在那個時候,我不確定該怎麼做:

char word[20]; 
strcpy(word,datorns_val()); 

我得到兩個錯誤,說:

Invalid conversion from 'char' to 'const char*'

initializing argument 2 of 'char* strcpy(char*, const char*)'

我在這裏使用strcpy()兩次或在正確的軌道上我會完全失去?我想我建立一個沒有功能的結構,只是在相繼輸入了所有代碼和它的作品,如果更換第二strcpy()用一個簡單的char word = valt_ord.

感謝,喬納森

(如果我的代碼是很難對不起明白了,我是瑞典人,我的第二語言是英語)

+0

你是返回一個字符數組是在棧上,所以這是不行的。你需要在堆上返回它的一個副本,你用'malloc'分配。 –

回答

2

目前你正在返回一個字符,這是沒有多大用處,因爲你需要一個字符串,將超過創建它的函數。您應該爲此返回一個動態分配的字符串(使用指針)。

char* datorns_val() 
{ 
     // ... your current code 
     char *ret_str = malloc(20); 
     strcpy(ret_str, valt_ord); 
     return ret_str; 
} 

在你使用它的最後,你應該在完成時釋放它。

char *result = datorns_val(); 
// use result 
free(result); 
result = NULL; 

或者,如果您確信這是調用datorns_val的功能是將要使用的結果,那麼我建議別的東西的唯一一個不涉及動態內存分配/ decalloc(malloc/free)。將要加載的字符串傳遞到datorns_val

int datorns_val(char (*str_ptr)[20]) // pointer to an array of 20 chars 
{ 
    // use str_ptr after dereferencing it to get back the char array 
    // say you want to copy "abc" to it 
    strcpy(*str_ptr, "abc"); 
    return 0; // to denote success, you may return -1 for failure 
} 

// caller's end 
char result[20] = ""; 
int success = datorns_val(&result); // pass the array by reference 

瞭解更多關於arrays and pointers更多地瞭解他們。

+0

謝謝你的傳說,這解決了這個問題! 我不認爲動態內存分配是必要的,因爲我們還沒有得到該課程的那一部分。我認爲我需要閱讀指針和數組,因爲我犯的錯誤感覺有點愚蠢。 – JonteG

+0

歡迎!學習_C_時,數組和指針是絆腳石。當你閱讀[正確的書籍](http://stackoverflow.com/q/562303/183120)並且練習很多時,它會變得更好。祝你好運 :) – legends2k

0

你的功能datorns_val聲明爲返回char而事實上它返回valt_ordchar[]型。也有一個更大的問題valt_ord是一個局部變量,所以即使你改變聲明的代碼將無法正常工作。您需要動態分配valt_ord(使用malloc)或將其作爲函數參數傳遞。

+0

你不得不說「把它的地址作爲函數參數」,否則它也不起作用。 – dhein

+0

@Zaibis這取決於作者想要做什麼。我的想法是修改函數中的數組,而不是分配它,並避免以這種方式使用動態內存。 –

相關問題