2014-02-01 1 views
-1

C++에서 문자열을 구문 분석하는 간단한 방법으로 sscanf를 사용하기로 결정했습니다. 다음은 코드 예제입니다Sscanf 관련 문제

int x,y,level; 
char type; 
char *line=NULL; 

if(inputMode=='M'){ 

    while(cin.getline(line,200)){ 
     sscanf(line,"(%d,%d,%d,%c)",x,y,level,type); 
    } 
} 

추출하려는 형식은 다음과 같습니다. 3 진수 값과 char 값을 추출해야하며, 읽은 파일의 모든 행은 동일한 형식을 갖습니다. 나는 char line [200]이라는 c-string을 만들었습니다. 저는 문자열이 테스트 될 때 파일 내의 최대 숫자가 수백만에이를 수 있다는 것을 얼마나 오래 알 수 있는지 결코 알지 못하기 때문에 임의의 크기로 200을 선택했습니다.

(3,2,1,#) 

% d은 (는) int *를 예상한다고 말하는 오류가 발생합니다. 그래서 x, y, 레벨 및 포인터를 변경하여 포인터를이 문제를 해결할 것이라고 생각했지만 컴파일러에서 x, y, 레벨 및 유형이 함수에서 초기화되지 않았다고 말합니다. 그게 도움이된다면 최신 g ++ -Wall -Werror를 사용하여 컴파일 중입니다.

+0

'sscanf에서 (선, "(% d 개, % d 개, % d 개 %의 C)", X, Y, 레벨을 &type);' – bobah

+0

하고 싶은 것입니다 "나는하기로 결정 sscanf를 C++에서 문자열을 파싱하는 더 간단한 방법으로 사용하십시오. "** 잘못된 ** 결정입니다. 'sscanf()는 수영을 할 수없는 사람을 위해 1000 미터 깊이로 다이빙을하는 초심자처럼 간단합니다. , 어떤 상황에서도'scanf() '를 사용해서는 안된다. 나는이 함수가 잘못 되었기 때문에 C 언어로 사용하는 것을 꺼린다. 반 직관적 인 작은 단점을 가지고있어 사용법을 익히기가 어렵다. C++에서는 표준 클래스 ('std :: stringstream','std :: string')와 문자열을 파싱하는 함수를 사용합니다. C에서는'strtok()','strchr()'등을 사용합니다. –

+0

괜찮아요, 내가 이미 그것을 통합했기 때문에 괜찮아요, stringstream으로 봐야 –

답변

2

변수 앞에 & 연산자가 누락되었습니다 (sscanf). 기능

sscanf(line,"(%d,%d,%d,%c)", &x, &y, &level, &type); 
          ^Notice the & operator. 
2

scanf와 가족들이 변수를 수정해야하기 때문에 포인터가 인자로 주어질 것으로 예상하고 사본을 전달하면, 그들은 복사본을 수정합니다 (따라서이 쓸모가 없다).

int x,y,level; 
char type; 
char *line=NULL; 

if(inputMode=='M'){ 

    while(cin.getline(line,200)){ 
     sscanf(line,"(%d,%d,%d,%c)",&x,&y,&level,&type); 
    } 
} 

당신이