2012-08-23 31 views
0

我剛剛開始與C並試圖掌握指針的整個想法,我剛剛遇到以下問題。如何將字符傳遞給用戶在C中輸入的printf?

我想打印出來,這是由它傳遞給一個單獨的功能,用戶輸入的字符:

#define MAX_OPTION_INPUT 1 
#define TRUE 1 
#define FALSE 0 


// print a menu 
void getCharacter() { 
    char getNum[MAX_OPTION_INPUT+2]; 
    int finished = FALSE; 

    // get character from user 
    do { 
     fgets(getNum, MAX_OPTION_INPUT+2, stdin); 
     if (getNum[strlen(getNum) - 1] != '\n') { 
      printf("Input one digit number please.\n"); 
      readRestOfLine(); 
     } 
     else { 
     getNum[strlen(getNum) - 1] = '\0'; 
     finished = TRUE; 
     } 
    } while (!finished); 

    processChar(getNum); 
} 


// process menu 
void processChar(char num) { 
    printf("TADA: %c", num); 
} 

當我編譯這個代碼,我得到一個警告:過客「processChar」的參數1從指針變成無整型的整數

當我運行它時,它會打印出一些奇怪的字符,而不是我應該傳遞的字符。

您能否向我解釋我在這裏錯過了這一點? 在此先感謝!

+1

你永遠不會真的在那個代碼中調用'processChar'。 –

+0

對不起,我的不好,整個事情實際上是一個更大的代碼的一部分,我只是把它縮小到這兩個函數。 *編輯 – YemSalat

+0

您接受了一個答案,告訴您更改函數的簽名。你不需要;你只需要傳遞正確的類型。當你傳遞'getNum'時,數組降級爲一個指向'char'的指針,所以你傳入一個指向一個函數的指針,該函數需要一個'char'。相反,只需傳入'getNum [0]'(或其中合適的元素)。 –

回答

3

變化的函數接受一個char *

void processChar(const char *num) 
{ 
    printf("TADA: %s", num); /* %s instead of %c */ 
} 

能否請您給我解釋一下,我就在這裏錯過了點?

你傳遞和使用num就好像它是一個字符,當它實際上是一個字符數組。

+0

非常感謝!有效。但爲什麼你需要把'const'放在那裏呢? – YemSalat

+2

你不需要/不需要。不過,使用const來告訴編譯器你不會更新某些東西是很好的風格。它不僅可以讓編譯器在優化方面有更大的靈活性,而且可以保證不會改變傳遞給你的內容,編譯器可以檢查你是否做到了這一點。 –

+1

@KonstantinLevin,如果另一個函數想傳入一個'const char *'或'const char []',因爲你的函數沒有改變它呢?這是發生了什麼:http://ideone.com/HRL36。這在C++中經常會出現,因爲有一個'string'類型可以轉換爲const char *',但是如果你嘗試調用一個函數,當它真的可以採用'char *'的時候'const char *',你必須做額外的工作來將字符串的結果轉換爲將const char *轉換爲非const的。 – chris

相關問題