2012-06-07 4 views
1

std::map 템플릿을 사용하려고하는데 작동하지 못했습니다. 인터넷에 대한 연구에서 나는이 솔루션에 와서에게 입력 스트림에 파일을 리디렉션 한, 여기에 코드입니다 :std :: map이 예상대로 작동하지 않습니다.

typedef map<char*, int> wc; 
int main() { 
    int c; 
    char cc[75], nombre[75]; 
    wc m; 
    scanf("%d", &c); 
    while (c--) { 
     scanf("%s %[ a-zA-Z]", cc, nombre); 
     ++m[cc]; // This should work 
     printmap(m); 
    } 
} 

인쇄지도는지도 객체를 인쇄하는 기능입니다.

Spain -> 1 
England -> 2 
Spain -> 1 

내가 기대하는 것은 : 내가 프로그램을 실행하면

3 
Spain Donna Elvira 
England Jane Doe 
Spain Donna Anna 

에서, OUPUT은 input.txt를 여기에 내 파일은 국가의 발생

Spain -> 2 
England -> 1 

수 표시된 횟수에 매핑 됨

+0

그래 충돌하지 않습니다. 'cc'와'nombre'에서 스캔 한 다음,'cc'에 대한 카운트를 증가시키고,'nombre'로는 아무것도하지 않습니다. 뭐가 문제 야? –

+3

'std :: map '... –

+0

이 작업은 C++보다 C 질문에 더 가깝다. 'std :: map'. – Drise

답변

6

위의 내 의견에 대한 해결책으로, 사용자가 작성한 코드의 C++ 버전 분개 :

typedef map<std::string, int> wc; 
int main() { 
    int c; 
    string cc, nombre; 
    wc m; 
    std::cin >> c; 
    while (c--) { 
     std::cin >> cc; 
     std::getline(std::cin, nombre); 
     m[cc] += 1; // This should work 
    } 
    printmap(m); 
} 

http://ideone.com/2JP82

첫째 : 키에 따라 std::map 종류의 그것의 데이터를 char cc[75]를 가리키는 코드, char*에. 따라서 cc의 텍스트를 바꾼 다음지도의 키가 변경되어 모든 것이 손상됩니다. 의 키는 변경되지 않아야합니다. 우리가 C++을 사용하기 때문에 char[]을 전혀 사용하지 않아야합니다. std::string을 대신 사용하십시오 ("값 유형"이기 때문에). 모든 것을 마술처럼 작동하게 만듭니다. 나는 당신이 printmap 기능을 보여주지 않기 때문에 이전에 어떻게 작동하는지 전혀 모른다.

둘째 : 한 줄을 읽을 때마다 printmap 번으로 전화하고 map은 "마지막으로 추가 한 내용"을 인쇄 할 방법이 없으므로 그 아이디어는 전혀 이해가되지 않습니다. printmap 호출은 전체 맵을 인쇄해야하며 루프 외부에 있어야합니다.

셋째 : scanf을 사용하지 마십시오. 안전하지 않습니다. 스트림을 사용하면 한 단어로 읽기에는 std::cin >> cc을, 라인에 남아있는 내용은 읽기 위해 std::getline(std::cin, nombre)을 사용합니다. 그런 식으로 누군가가 (longest country namelongest last name에 대한 소스) 라인을 입력하면 코드가 당신이 프로그램을 정확히하고있어,

Krungthepmahanakornamornratanakosinmahintarayuttha-yamahadilokphopnopparatrajathaniburiromudomrajaniw-esmahasatharnamornphimarnavatarnsathitsakkattiyavi-sanukamprasit Wolfeschlegelsteinhausenbergerdorffvortschaferswesenchafewarenwholgepflegeunzenvonangereifenduchihrraubgiriigfeindtausendjahresvorandieerscheinenbanderechiffgebrauchlichtalsseinursprungvonkrrthinzwischensternartigraumaufdersuchebtbewohnbarplanetenkreisedrehensichundstandigmenshlichkeittkonntevortpflanzeslamdlichfreudeundruhemitnichteinfurchrintlligentgeschopfsvonhinzwischenster 
+0

+1 for @ MooingDuck 's 편집. > _> – ildjarn

+0

OP가'scanf '를 사용하는 방식이 실제로 안전하지 않더라도'scanf'가 안전하지 않다는 것에 동의하지 않습니다 *.형식 지정자는 문자열에 대한 제한을 제공해야한다는 매우 간단한 규칙에 따라 안전 문제를 수정하여 C 스타일 I/O (C++ 표준 라이브러리의 일류 멤버이기도 함)를 선호 할 때 함수를 사용할 수있게 만듭니다. – dasblinkenlight

+1

대부분의 C++ 프로그래머는 타입 안전만을 위해 스트림이'scanf '보다 낫다고 동의합니다. –

관련 문제