2011-09-07 7 views
0

문자열을 첫 번째 공백 문자로 두 부분으로 나누고 싶습니다. 예를 들어, 나는 "Hay Guys LOL"이라는 문자열을 가지고 있는데, "Hay"가 하나의 변수에 있어야하고, "Hay"가 다른 변수에 있어야하고, "Guys LOL"이 다른 변수에 있어야합니다.문자열을 한 번 분할하는 방법은 무엇입니까?

나는 strtok과 같은 기능을 들여다 보았다. 작동하지만, 반복하지 않고 문자열을 결합하는 것을 선호한다.

char test[32]; 
strcpy(test, "Hay Guys LOL\r\n"); 

// p1 should have "Hay", and p2 have "Guys LOL"? 
char p1[16], p2[16]; 
sscanf(test, "%s %s\r\n", p1, p2); 

printf("p1: %s\n", p1); 
printf("p2: %s\n", p2); 

감사 : 여기

내가 현재 (시도 sscanf를)가 무엇인가!

+2

정말로 ""\ n "'이 아니라 문자열에"\ r \ n ""을 원하는지 고려하십시오. C는''\ n "'을 사용하여 줄 끝을 나타냅니다. 그것은 입력과 출력에서 ​​시스템 특정 줄 끝 (일반적으로' "\ n"'또는' "\ r \ n"')에서 텍스트 스트림으로 변환됩니다. 그것은 문자열을 사용할 대상에 따라 다릅니다. –

답변

2

하면 확인 : 첫 번째 blankspace는 "헤이"를 읽어 개까지

sscanf(test, "%s %[^\r\n]", p1, p2); 

첫 번째 %s는 첫 번째 문자열을 읽습니다. 다음에 '\r' 또는 '\n'이 아니고이 발견 될 때까지 (^[]이 세트를 뒤집을 때까지) 스캔 세트가 읽혀집니다. 따라서 %[^\r\n]은 나머지 문자열을 p2으로 읽습니다. 버퍼를 방지하기

UPDATE

@ 아담 로젠 필드가 말했듯이, 당신은 sscanf에 의해 p1p2에 넣어 문자의 수를 제한 할 필요가 오버 플로우. %10[^\r\n]%10s과 같은 문자를 지정하십시오. 이 번호는 형식 문자열의 일부가되어야하므로 사용하기 전에 형식 문자열을 동적으로 만들려는 경우가 있습니다.

char format_string[MAX]; 

sprintf (format_string, "%%%ds %%%d[^\\r\\n]", 10, 10); 

sscanf (test, format_string, p1, p2); 

길이 제한이있는 형식 문자열을 먼저 작성한 다음 사용합니다. 이스케이프 문자를 유의하십시오. %%은 출력에 단일 %을 인쇄하고 \\은 출력 문자열에 \을 인쇄하는 데 사용됩니다.

+0

완벽하게 작동합니다! 고맙습니다. – jo1

+1

버퍼 오버 플로우 조심해! 'p1'과'p2'가 각각 16 바이트 길이라면'% 16s % 16 [^ \ r \ n] ''형식의 문자열을 사용하는 편이 낫습니다. –

+0

나는 대답을 받아들이려고 노력하고있다 - 나는 50 초 만에 그렇게 할 수 있다고 말한다. – jo1

관련 문제