2011-03-06 2 views
3

내 문제는 내 프로그램에서 키보드로 입력 한 값을 읽지 않고 첫 번째, 두 번째 및 마지막으로 읽는 것입니다. 나는 cin.ignore()로 시도했다. 및 기타 솔루션 그러나 작동하지 않습니다.C++ cin.getline() fail

Insurance 1 
Model: mazda 

serial number: 60 

Price: 9999 

Contract number: 76Z 

Contract money: 12 

// 모든 문자 후, 거기에 \이었다 n을 입력 :

입력합니다.

Insurance 1 
Model: mazda 

serial number: 60 

Price: 0 

Contract number: 

Contract money: 12 

내가 여기에 쓰기 만 기능, 모든 프로그램 :

는 출력

코드에 문제가 몇 가지가 있습니다
struct tseg{ 
    char model[15]; //nombre del modelo 
    char serialnumber[15]; //número de serie del coche 
    double price; //precio de compra del coche 
    char contractnumber[15]; //numero del seguro 
    double contractmoney; //importe del contrato 
}; 

bool registrarSeguro(tconces *a, int p, int total){ //p is the position!!! 

     a[p].contrato = new tseg[a[p].numSegurosActuales]; 

     cout << "Enter model: " <<endl; 
     cin.ignore(); 
     cin.getline(a[p].contrato[a[p].numSegurosActuales].model, 15); 
     cout << "Enter serial number: " <<endl; 
     cin.ignore(); 
     cin.getline(a[p].contrato[a[p].numSegurosActuales].serialnumber, 15); 
     cout << "Enter price: " <<endl; 
     cin.ignore(); 
     cin >> a[p].contrato[a[p].numSegurosActuales].price; 
     cout << "Enter contract number: " <<endl; 
     cin.ignore(); 
     cin.getline(a[p].contrato[a[p].numSegurosActuales].numContrato, 15); 
     cout << "Enter contract number: " <<endl; 
     cin >> a[p].contrato[a[p].numSegurosActuales].impContrato; 

     a[p].numSegurosActuales++; 
     sw = true; 

return (sw); 
} 
+4

영어를 제 2 언어로 사용하는 사람으로서 영어로 코딩을 시작 하시길 바랍니다. StackOverlow와 같은 사이트에서 도움을 요청하는 것이 훨씬 쉽습니다 (코드가 자체 문서화한다고 가정). – suszterpatt

+1

키보드에서 입력 한 내용을 정확하게 (정확히) 이해하는 데 도움이되며 입력 내용 중 실제로 개행 문자와 같은 데이터 구조의 부분에 기록 된 내용이 무엇인지 파악하는 데 도움이됩니다. 또한 문제 (예 : 함수의 처음 몇 줄과 같은)와 관련이없는 소스 코드 부분을 삭제하는 것이 좋을 수도 있습니다. – Jollymorphic

+0

@suszterpatt && @Jollymorphic : 내가 해준 조언에 감사드립니다! – freinn

답변

1

std :: getline()을 사용하여 데이터를 문자열로 읽은 다음 내용을 필드에 복사하여 필요한 경우 복사 할 문자 수를 제한 할 수 있습니다.

#include <util> 
#include <cstring> 

// ... 

std::string input; 
std::getline(cin, input); 

// +1 char for end of string 
std::strncpy(a[p].contrato[a[p].numSegurosActuales].model, input.c_str(), 14); 

이렇게하면 입력이 항상 결함없이 발생합니다. 보류 문자 없음, 스트림 오류 없음, 전혀 문제 없음. 단점은 필요한 경우 번호를 변환해야하지만 이미 그렇게하고 있다는 것입니다. ¡ Buena suerte!

1

. 하나는 입력에 대해 보여주는 필드 인 Contrato가 구조체에있는 필드가 아니라는 것입니다. 값을 표시 할 때 어떤 필드를 사용합니까?

다른 것은 cin.ignore()에 관한 것이고, 기본적으로 입력의 다음 문자를 무시합니다. 해당 위치에 이 정확히 인 경우, 줄 바꿈을 건너 뛰기 위해 사용할 수 있습니다. 공백이나 두 개와 같은 다른 것이 있으면 행 끝을 찾으면 서 최대 1000자를 건너 뛰는 cin.ignore (1000, '\ n')를 사용할 수 있습니다.

getline()을 사용하면 끝 마커를 포함하여 전체 행을 읽으므로 ignore()를 사용하면 안됩니다.