2014-09-21 75 views
0

我試圖將char []傳遞給另一個函數,但出於某種原因,我不斷收到奇怪的輸出,但沒有錯誤。我有以下幾種方法:將char []傳遞給另一個函數時出現奇怪的輸出

void storeKey() 
{ 
    char keyArray[10]; 
    cout << "Please enter 10bit key" << endl << "==> "; 
    cin >> keyArray; 
    storePlaintext(keyArray); 
    cout << keyArray << endl; 
} 

void storePlaintext(char key[]) 
{ 
    char plaintextArray[8];  
    cout << "Please enter 8bit plaintext" << endl << "==> "; 
    cin >> plaintextArray; 

    cout << plaintextArray << endl << key[1] << endl; 
    //cout << plaintextArray << endl << key << endl; 
} 

我應該得到一個打印出來的:00000000和1111111111在下一行接着1111111111 但我得到0000000那麼「C」(或隨機的東西),其次是111111111 WHY這是否發生?我應該能夠通過一個數組像我沒有問題沒有對嗎?我需要能夠將數組從函數傳遞到函數並使用它們中的數據。任何幫助都感激不盡。謝謝

+0

如果數組長度爲10個字符,則不能在其中存儲超過9個字符而不會導致未定義的行爲,因爲您需要第10個點用於空終止符。所以輸出'1111111111'會表明你已經觸發了UB,輸入的字符串長於程序可以定義的方式處理的時間。 – cdhowie 2014-09-21 04:27:00

+4

使用'std :: string'。緩衝區溢出是一個問題,std :: string只能解決。 – chris 2014-09-21 04:27:17

+0

即使您沒有使用std :: string,也不要聲明與您想要的大小非常接近的數組,您沒有任何錯誤餘量。如果你已經用50個字符聲明瞭這些數組,你就不會遇到這個問題(但仍然使用'std :: string',所有這些問題都會消失)。 – PaulMcKenzie 2014-09-21 04:27:55

回答

2

使用std::string

#include <string> 
#include <fstream> 
#include <iostream> 

using namespace std; 

void storePlaintext(const string& key); 

void storeKey() 
{ 
    std::string keyArray; 
    cout << "Please enter 10bit key" << endl << "==> "; 
    getline(cin, keyArray); 
    storePlaintext(keyArray); 
    cout << keyArray << endl; 
} 

void storePlaintext(const string& key) 
{ 
    string plaintextArray;  
    cout << "Please enter 8bit plaintext" << endl << "==> "; 
    getline(cin, plaintextArray); 
    if (key.size() > 1) 
     cout << plaintextArray << endl << key[1] << endl; 
} 

使用注意事項的std::stringstd::getline,並且傳遞參數由(常數)參考。此外,檢查以確保key具有多個字符已完成,因爲訪問key[1]長度爲1或更小的字符串是未定義的行爲。

相關問題