2011-08-05 3 views
0

텍스트 줄의 구문 분석에 도움이 필요합니다. 파싱되는 텍스트 줄은 사용자 입력입니다.은 문자열 파싱에 도움이 필요합니다.

파이프가있는 것을 구문 분석하려고합니다.

예 : hello world | one two

파이프가 ArgList에 들어가기 전에 단어를 얻을 수 있습니다. 그러나 ArgList2에 파이프 이후에 단어를 얻는 방법을 알아낼 수 없습니다. 파이프 symobol은 아무 곳에 나 저장할 필요가 없습니다.

기본적으로 어떻게해야합니까?


int main(void) 
{ 

char *ArgList[MAX_ARG_LENGTH]; 
char *ArgList2[MAX_ARG_LENGTH]; 

char buf[MAX_BUF_LENGTH]; 

int i = 0 


printf("> "); 

if(!fgets(str, MAX_BUF_LENGTH, stdin)) 
perror("fgets error"); 

ArgList[i] = strtok(bufstr, " \n"); 

while(ArgList[i] != NULL) 
{ 
    printf("%s", ArgList[i]); 

    i++; 
    ArgList[i] = strtok(NULL, " \n"); 
} 

return 0; 
} 

어떤 제안

ArgList[0] = hello 
ArgList[1] = world 

ArgList2[0] = one 
ArgList2[1] = two 

주시면 감사하겠습니다. 먼저 전체 사용자 입력 문자열을 ArgList로 토큰 화 한 다음 파이프 기호 다음의 모든 항목을 ArgList2로 이동해야합니까?

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+1

이 코드를 실행하면 어떻게됩니까? –

답변

3

나는 같은 것을 할 것입니다 :

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 

char buf[30] = "hello world | one two"; 

char *str = buf; 

char *str1 = strsep(&str, "|"); 
char *str2 = strsep(&str, "\n"); 

printf("\nstr1 = %s and str2 =%s \n", str1, str2); 
return 0; 
} 

참고 : 당신은 지금 당신이 일을 당신의 방법을 방법을 파악해야한다.

+0

'strsep' is is ANSI C가 아니기 때문에 OP가 원하는 것은하지 않습니다. –

+0

@Oli Charlesworth : OP는 'ANCI C'를 위해 뭔가 구체적으로 물어 보았습니까? 나는 그렇게 생각하지 않습니다. ** NOTE **. – hari

+0

똑같이, OP는 그가 POSIX 시스템에 있었다고 지정하지 않았다. –

3

scanf()을 사용해보세요.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char args1[NUMBER_OF_RECORDS][MAX_BUF_LENGTH]; 
    char args2[NUMBER_OF_RECORDS][MAX_BUF_LENGTH]; 
    char buf[MAX_BUF_LENGTH]; 
    char buf2[MAX_BUF_LENGTH]; 
    int i = 0; 

    while (scanf("%s | %s", buf1, buf2)) { 
     strcpy(args1[i], buf1); 
     strcpy(args2[i], buf2); 
     i++; 
    } 
    /* Do something with args1 or args2 */ 
    return 0; 

}

이 코드는 정확하게 100 % 작동하는 것을 보장. 또한 scanf()은 오류가 발생하기 쉽기 때문에주의해서 사용해야합니다.

+0

예를 들어 답이 더 유용 할 것입니다 ... –

+0

scanf()는 문제가 없지만 첫 번째 scanf() 호출이 정상적으로 작동하는 버그가 있지만 사용자가 stdin에서 Enter 키를 누른 경우 scanf)는 버퍼를 올바르게 지우지 않고 두 번째 변수는 캐리지 리턴이됩니다. 다음과 같이 개행 문자를 입력하면 주위를 둘러 볼 수 있습니다 : scanf ("\ n % d", &a); 반드시 사용해야 할 것 같지 않지만 알면 좋습니다.) – ambagesia