2014-01-26 66 views
1

有些人在我的另一個問題中向我展示了一個漂亮的代碼。那就是:將一個void函數轉換爲char * C++

#include <iostream> 
#include <cstring> 

using namespace std; 

void encode(char* source, char const* alpha) 
{ 
    int i, j; 
    int len = strlen(source); 
    for (i = 0; i < len; i++) 
    { 
     if (source[i] >= 'a' && source[i] <= 'z') 
     { 
      j = source[i] - 'a'; 
      source[i] = alpha[j]; 
     } 
    } 
} 

int main(void) 
{ 
    char source[1001]; 
    char alpha[27]; 
    cin.getline(source, 1001); 
    cin.getline(alpha, 27); 
    encode(source, alpha); 
    cout << source; 
    return 0; 
} 

我應該怎麼做來改變這個void功能爲char*一個(應爲char* encode(char* source, char const* alpha))?顯然,它不會是一個'空白'它應該返回一個值,但什麼價值?這些指針讓我非常困惑。

+0

你需要知道應該返回什麼。 'encode'正在處理指針,從而修改'main'中的變量。也許什麼都不需要返回。 –

+0

爲什麼它應該是'char *'?它完美地作爲一個空白。 – ApproachingDarknessFish

+0

@ValekHalfHeart我真的沒有選擇。 – user3213110

回答

6
#include <iostream> 
#include <cstring> 

using namespace std; 

char* encode(char* source, char const* alpha) 
{ 
    int i, j; 
    int len = strlen(source); 
    for (i = 0; i < len; i++) 
    { 
     if (source[i] >= 'a' && source[i] <= 'z') 
     { 
      j = source[i] - 'a'; 
      source[i] = alpha[j]; 
     } 
    } 
    return source; 
} 
int main() 
{ 
    char source[1001]; 
    char alpha[27]; 
    cin.getline(source, 1001); 
    cin.getline(alpha, 27); 
    cout << encode(source, alpha); 
    return 0; 
} 

做這樣的事情。如果你想改變一個主要的char數組,你的void函數將會起作用。 :)

+0

謝謝,但應該'int main(void)'留下來嗎?我需要什麼'void'? – user3213110

+1

@ user3213110看我的編輯。不,你不需要失效。我只是錯過了。 :) – Rashad

2
char* encode(char* source, char const* alpha) 
{ 
    int i, j; 
    int len = strlen(source); 
    for (i = 0; i < len; i++) 
    { 
     if (source[i] >= 'a' && source[i] <= 'z') 
     { 
      j = source[i] - 'a'; 
      source[i] = alpha[j]; 
     } 
    } 
    return source; 
} 

雖然它看起來不像你做任何事情那樣的返回值。

(是你應該返還char數組的副本,或就地正在修改它好嗎?)

+0

這真的很簡單嗎?坦率地說,我今天早些時候嘗試了同樣的事情,但這是徒勞的 - 沒有成功。那麼..我愚蠢的任務說我應該這樣做。我應該只修改數組並打印出來,就是這樣。 – user3213110

+0

由於void函數()僅僅意味着沒有返回語句,所以將函數更改爲char *函數()意味着具有char *類型的返回語句是預期的。將char * source作爲參數傳遞給函數會傳遞一個指向char *類型的c風格字符串的指針。這意味着當您對函數中的「source」char *數組執行任何操作時,它會將「source」數組的位置指向函數之外並更改其中的值。源的返回是多餘的,因爲您應該已經可以訪問作爲指向函數的指針傳遞的已修改數組。 – Wilsonator

1

返回char *真的纔有意義,如果你想提醒調用函數發生了錯誤:

char *encode(char *source, char const *alpha) 
{ 
    int i, j; 
    int len = strlen(source); 

    /* Check For Argument Errors */ 
    if((source == NULL) || (alpha == NULL)) 
     return NULL; 

    for (i = 0; i < len; i++) 
    { 
     if (source[i] >= 'a' && source[i] <= 'z') 
     { 
      j = source[i] - 'a'; 
      source[i] = alpha[j]; 
     } 
    } 

    return source; 
} 

調用這個函數可以檢查錯誤是這樣的:

if(encode(source, alpha) == NULL) 
{ 
    printf("Encoding error!\n"); 
    return -1; 
} 
else 
{ 
    cout << source; 
} 
相關問題