2013-05-27 1 views
0

숙제를해야합니다. 서두르지 않아, 이걸 끝내기에는 충분한 시간이있어. 나는 포럼을 둘러보고 (포럼처럼 보입니다) 이곳의 커뮤니티에 대한 지식과 감각을 매우 감사하게 생각합니다. 나는이 멍청한 질문에 대답 한 다른 사람들의 은혜에서 많은 기술을 적용했다.C - 문자열을 가져 와서 하이픈 구분 기호를 사용하여 작은 문자열로 구문 분석/토큰 화

어쨌든, 하이픈이 포함 된 문자열을 입력하고 (하이픈 앞의) 문자열의 첫 번째 그룹이 알파벳/문자 만있는 것을 확인하면 다음 그룹이됩니다. 숫자 만 가능하며 마지막 그룹은 알파벳/문자입니다. 이 프로젝트에 simular입니다 : http://wps.aw.com/wps/media/objects/7257/7431666/Case_Studies/GaddisJavaCSO_CS6.pdf

지금까지 3 개의 변수로 문자열을 분할에 붙어 붙어 있습니다. 나는 strtok를하고는 scanf 기능을 조작에 대해 읽고,하지만 난 성공하지 않은 : 당신은 strtok를 잘못 사용하는

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

int main() 
{ 
char serial [50]; 
char * part1 = NULL, part2 = NULL, part3 = NULL; 
    printf("Enter Serial Number:\n"); 
    scanf("%s", serial); 
part1 = strtok (serial, "-"); 

part2 = strtok(NULL, "-"); 
part3 = strtok(NULL, "-"); 

    printf("You entered %s\n", part1); 
    printf("You entered %s\n", part2); 
    printf("You entered %s\n", part3); 
return 0; 
} 
+0

'*'는 데이터 유형의 일부가 아니므로 작성하고 싶다고 생각합니다. 'char * part1 = NULL, * part2 = NULL, * part3 = NULL;' – Johannes

답변

1

, 그것을 매개 변수를 전달하고 그것을 잘 작동합니다.

char * part1= strtok (serial, "-"); 
    char * part2 = strtok(NULL, "-"); 
    char* part3 = strtok(NULL, "-") 

StrTok + example

+0

Dory Zidon - strtok 사용은 첫 번째 그룹을 분할하는 데 사용되지만 두 번째/세 번째 그룹의 포인터 변환이 불가능합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – Nixnexus

+0

@Nixneuxs - 각 poat를 char *로 정의해야합니다. 그렇지 않으면 char *가 아닌 char *입니다 ... 편집 된 예제에서 보여 주거나 각 var 앞에 포인터 표기법을 사용하는 방법입니다. –

+0

와우 i 지금 너무 바보 같아. 너무 많이 도리 지 돈 주셔서 감사합니다 ... – Nixnexus

0
strcpy(part1, strtok(serial, "-"));//premise: string has hyphen 
strcpy(part2, strtok(NULL, "-")); 
strcpy(part3, strtok(NULL, "-")); 
0

당신은에서 직접 문자열을 읽을 scanf의 서식 규칙을 사용할 수 있습니다 :

char * pch = strtok (serial, "-"); 
while (pch != NULL) 
{ 
    printf ("%s\n",pch); 
    pch = strtok (NULL, "-"); 
} 

또는 예

당신은 문자 * 각을 정의해야합니다 입력 행
#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char part1[40], part2[40], part3[40]; 
    int count, n; 
    do{ 
     n = 0; 
     flushall(); 
     printf("Enter Serial Number:\n"); 
     count = scanf(" %39[A-Za-z]-%39[0-9]-%39[A-Za-z]%n", part1, part2, part3, &n); 
     if(count != 3 || n == 0){ 
      printf("Recognize %i parts, %s\n", count, n == 0 ? "did not parse to the end" : "parsed to the end"); 
     } 
    }while(count != 3 || n == 0); 

    printf("You entered %s\n", part1); 
    printf("You entered %s\n", part2); 
    printf("You entered %s\n", part3); 
return 0; 
} 

입력을 구문 분석의 매우 엄격한 형태와 외부 형태를 유지하기 위해 사용자가 필요합니다. %s을 사용하지 않고 %[0-9]과 같이 허용 된 문자열을 쉽게 필터링 할 수 있습니다. 내가 serialnumber 입력을 필터링 할 수있는 가장 좋은 방법은 항상 정규식이었다. 그러나 나는 이것이 아직 숙제의 일부라고 생각하지 않는다. :)

+0

음, 그게 슈퍼 고급 롤 소리. 키의 각 부분을 40 자로 정의한 것처럼 보입니다 ... 응답을 주셔서 대단히 감사 드리며 향후 과제에 대한 힌트를 제공합니다. 나는 새로운 스레드를 시작하기 전에 Regex가 대답을 좁히려 고 많은 시간을 언급했다는 것을 보았습니다. – Nixnexus

+0

문자열 제한은 보안 문제입니다. scanf는 char 포인터 뒤의 버퍼 크기를 측정 할 수단이 없기 때문에 문자열 버퍼를 오버플로 할 수 있습니다. 이 기능을 사용하여 파트의 크기를 제한 할 수도 있습니다. 당신이 정규식으로 약간의 바이올린을 원한다면 다음과 같은 온라인 정규식 테스터를 사용할 수 있습니다 : http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx – Johannes

관련 문제