2014-09-21 4 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; 
} 

: 나는 다음과 같은 방법이 1111111111 다음에 다음 줄에 00000000와 1111111111을하지만 난 후 "C"가 (또는 뭔가 랜덤) 111111111. 왜 다음에 0000000를 얻을 수 이 일이 일어 났습니까? 내가 아무 문제없이 잘하고있는 것처럼 배열을 전달할 수 있어야합니까? 함수에서 함수로 배열을 전달하고 그 내부의 데이터를 사용할 수 있어야합니다. 어떤 도움을 많이 주시면 감사하겠습니다. 감사합니다.

+0

배열의 길이가 10 문자 인 경우 null 종결 자에 대해 10 번째 자리가 필요하므로 정의되지 않은 동작을 발생시키지 않고 9 자 이상을 저장할 수 없습니다. 따라서'1111111111'을 출력하면 프로그램이 정의 된 방식으로 처리 할 수있는 것보다 긴 문자열을 입력하여 UB를 트리거 한 것을 나타냅니다. – cdhowie

+4

'std :: string'을 사용하십시오. 버퍼 오버 플로우는'std :: string'이 모두 해결하는 문제입니다. – chris

+0

std :: string을 사용하지 않았고 원하는 크기에 너무 가깝게 배열을 선언하지 않아도 오류가 발생하지 않습니다. 배열을 50 자로 선언했다면 문제가 발생하지 않을 것입니다 (그러나 여전히'std :: string'을 사용하고 모든 이슈는 사라집니다). – PaulMcKenzie

답변

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; 
} 

주 (CONST) 참조로 std::string, std::getline의 사용 및 매개 변수 전달. 또한 길이가 1 이하인 문자열 key[1]에 액세스하면 정의되지 않은 동작이므로 key이 1 문자 이상 있는지 확인하는 검사가 수행됩니다.

관련 문제