2016-06-22 5 views
0

저는 C++을 매우 처음 사용했습니다.C++ crypt (3) segementation 오류가 발생했습니다.

파일을 열고 모든 행을 읽고, crypt(3) 알고리즘을 사용하여 해당 행을 해시 한 다음 출력 파일에 다시 쓰려고합니다.

그러나 crypt() 메서드를 사용할 때마다 세그먼트 오류가 발생합니다. 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까? 고맙습니다. 내가 코드를 컴파일하는 데 사용하고

명령 :

g++ hasher.cpp -o hasher -lcrypt 

내 코드 :

#include <iostream> // User I/O 
#include <fstream> // File I/O 
#include <vector> // String array 
#include <cstdlib> // Exit method 
#include <crypt.h> // Crypt(3) 

// Input & Output file names 
std::string input_file; 
std::string output_file; 

// Plaintext & Hashed passwords 
std::vector<std::string> passwords; 


// Read input and output files 
void read_file_names() 
{ 

    std::cout << "Input: "; 
    std::getline(std::cin, input_file); 

    std::cout << "Output: "; 
    std::getline(std::cin, output_file); 
} 

// Load passwords from input file 
void load_passwords() 
{ 
    // Line/Hash declarations 
    std::string line; 
    std::string hash; 

    // Declare files 
    std::ifstream f_input; 
    std::ifstream f_output; 

    // Open files 
    f_input.open(input_file.c_str()); 


    // Check if file can be opened 
    if (!f_input) { 
     std::cout << "Failed to open " << input_file << " for reading." << std::endl; 
     std::exit(1); 
    } 

    // Read all lines from file 
    while(getline(f_input, line)) 
    { 
     // This line causes a segmentation fault 
     // I have no idea why 
     hash = crypt(line.c_str(), ""); 
     std::cout << "Hashed [" << hash << "] " << line << std::endl; 
    } 
} 

// Main entry point of the app 
int main() 
{ 
    read_file_names(); 
    load_passwords(); 
    return 0; 
} 
+0

디버거를 나타내는 줄은 무엇입니까? –

+0

저는 C++을 처음 사용 했으므로 아직 디버거가 없지만 다음과 같은 결과가 나왔습니다 :'hash = crypt (line.c_str(), ");' – Paradoxis

+0

'line.c_str() '토굴 (crypt) '에 대한 호출처럼 보입니까? 그것은 NULL이 아닌가요? 'crypt'를 호출하기 직전에'std :: cout << "줄을 추가해보십시오 :"<< line.c_str() << std :: endl; 또한 gcc를 사용하고 있다면 디버거를 가지고 있습니다 - gdb (http://www.cs.cmu.edu/%7Egilpin/tutorial/)라고 부릅니다. –

답변

1

호출의 두 번째 매개 변수 (하여 crypt) (소금)은 문자열을 사용합니다. 작업을 수행하려면 최소 2 자의 문자열을 전달해야합니다 (the manual에서와 같이). 예 : crypt(line.c_str(), "Any string here");