2011-12-31 3 views
1

sscanf를 사용하여 설명서를 읽은 후에도 잘 모르겠습니다. 여기 이 유형의 문자열에 대한 sscanf

는 내가하고 싶은 것입니다 : 첫 번째 64 개 문자 또는 공간까지 읽기

이 그런 공간, = 다음 다른 공간이 될 것입니다 도달 : 는 텍스트 문자열을 주어진. 그 다음에 문자열 끝까지 또는 8192 문자가 도달 할 때까지 다른 문자열을 추출하려고합니다. 또한 "\ n"의 두 번째 문자열에서 실제 줄 바꿈 문자로 변경하는 것이 좋습니다.

나는 : "% 64s = % 8192s"을 가지고 있지만 이것이 정확하다고 생각하지 않습니다.

감사

예 :

element.name = 안녕하세요 \ nworld는

내가 표준을 권장합니까

hello 
world 
+0

몇 가지 불명예가 있습니다. "문자열 끝까지"== "줄 끝까지"? "실제 개행 문자"?? –

+0

공간과 개행을 구별하지 않기 때문에이 작업은'sscanf '로는 해결할 수 없습니다. –

+0

sscanf는 거의 모든 입력 확인 문제에 대한 해답이 아닙니다. 행을 문자열로 읽어 들여 일반 문자열 조작이나 정규 표현식을 사용하여 데이터를 확인하십시오. – jmucchiello

답변

1

로 element.name 1과 문자열과 문자열 일이겠습니까 :: 이것에 대한 정규식은 그렇지만 그 외에도 약간의 오류 검사를 통해 문제가 없을 것입니다 :

#include <cstdio> 

int main(int argc, const char *argv[]) 
{ 
    char s1[65]; 
    char s2[8193]; 
    if (2!=std::scanf("%64s = %8192s", s1, s2)) 
     puts("oops"); 
    else 
     std::printf("s1 = '%s', s2 = '%s'\n", s1, s2); 
    return 0; 
} 
+1

'% 8192s '는 첫 번째 공백에서 멈추며 아마도 결과가 아닙니다. '% 8192 [^ \ n]'(최대 8 KiB의 개행 문자가 아님)로 도망 갈 수 있습니다.'문자열 끝 '은'줄 끝 '을 의미한다고 가정합니다. 문자 백 슬래시 - n과 개행 문자는 별개의 작업입니다. –

1

형식 문자열이 내게 적합합니다. 그러나 sscanf는 "\ n"의 항목을 다른 것으로 변경하지 않습니다. 그렇게하기 위해서는 strtok을 사용하는 루프를 작성하거나 문자열의 각 문자를 평가하고 선호하는 문자로 교체하는 단순한 루프를 작성해야합니다. 또한 sscanf 반환 값을 평가하여 2 개의 문자열이 실제로 올바르게 스캔되었는지 확인해야합니다. sscanf는 형식 문자열에 따라 성공적으로 스캔 된 필드 수를 반환합니다.

@sehe는 올바른 반환 값 확인을 포함하여 sscanf의 올바른 사용법을 보여줍니다.