2012-07-16 5 views
0

저는 C에 익숙하며 문자 배열 (Ardunio의 직렬 포트에서 수신)을 분할하려고합니다. 자습서를 찾아 보았습니다. 제발 디버깅 좀 도와주세요.혼란 스럽습니다 : C의 포인터와 문자 배열

char action[10]; 
unsigned long duration; 

void split(char input[20]) 
{ 
char *param, *ptr; 

param = strtok_r(input, "#", &ptr); 
action = *param;      // Need help with this line 

param = strtok_r(NULL, "!", &ptr); 
duration = (unsigned long) *param; // Need help with this line 
} 

내가 이해 한 바로는 strtok_r은 구분 기호 (#) 바로 뒤에있는 문자에 대한 포인터를 반환합니다. 그래서 action []이 구분자까지 입력 []의 부분 집합 문자 배열이되기를 원한다면 어떻게해야합니까?

편집 : 입력 내용은 다음과 같습니다. "left # 1000!"

+1

어레이와 특별한 선언 제외 '='연산자 "부여"할 수 없다. 여기에'char * action' 포인터가 필요합니다. 그리고'unsigned long'에서 길이를 얻으려면 문자를 먼저 숫자로 변환해야합니다 (이 경우'strtoul '). – nhahtdh

+1

소스 문자열의 예를 게시 할 수 있습니까? 'paramparamparamparam # duration.NNN'과 같은가요? –

+1

입력에'! '를 종결 기호로 사용하는 경우 구분 기호 목록에 추가하십시오.' "#!"' – dasblinkenlight

답변

1

첫 번째 토큰이 문자열이고 두 번째 토큰이 긴 것으로 보입니다. strncpy을 사용하여 paramaction으로 복사 한 다음 을 unsigned long에서 duration으로 구문 분석 할 수 있습니다.

param = strtok_r(input, "#!", &ptr); 
strncpy(action, param, sizeof(action)); 
// Force zero termination 
action[sizeof(action)-1] = '\0'; 

param = strtok_r(NULL, "#!", ptr); 
duration = strtoul(param, &param, 10); 
+0

감사합니다. 그게 효과가 있었어. 내가 이해할 수없는 것은 이것이다 : param은 포인터이다. 그렇다면 strncpy는 그것을 매개 변수로 어떻게 사용합니까? – ask

+2

@ask 배열은 포인터로 쇠퇴하고 포인터는 할당 된 메모리 블록을 가리킬 수 있기 때문에'strncpy'는 배열로 간주하지 않고 포인터로 가정합니다. NUL이 보일 때까지 (또는 다른 문자열이 끝날 때까지 앞으로 가리키는 위치에 쓰는) 때까지 계속 가리 킵니다. 가급적이면 책에서 함수, 배열 및 포인터에 대해 더 많이 배워야합니다. – Shahbaz

+0

감사합니다.나는 주로 Java를 사용하므로 포인터와 같은 C의 기본 개념에 대한 초보적인 지식 만 갖고 있습니다. 확실히 찾아 볼 것입니다. – ask

1

action = *param을 초기화 할 수 없습니다.

당신은

memcpy(action, param, strlen(param)) 

를 사용할 필요가
duration = (unsigned long) atoi(param) 
1
당신은 C.

방문을 문자열 (또는 문자 배열)을 할당하기 위해 strcpy를() 필요 캐스팅을 사용해야합니다

http://en.cppreference.com/w/c/string/byte/strcpy

이 함수는 멤버 간 할당 귀찮아. 수동으로 수행하려면 루프를 사용하고 각 배열 구성원을 별도로 할당해야합니다.

+0

상황에 관계없이'strcpy'를 사용하지 말 것을 권합니다. – nhahtdh

+0

C 언어의 새로운 기능 ... strcpy가 지금은 괜찮다고 생각합니다. – antonio

1

이 스 니펫은 일반 C (주석이 추가됨)에서 작동해야합니다. C struct을 사용하여 값을 수집 할 수 있습니다. Struct은 간단한 데이터 유형과 같은 함수에서 반환 될 수 있습니다 (표시된 것처럼). 이를 자신의 프로그램의 시작으로 사용할 수 있습니다.

편집 : (당신이 들어오는 데이터에 '\0' -bytes이있을 수 있습니다 경우에 유용합니다) 이러한 프로그램은 strXYZ(..) 기능이 필요하지 않습니다.

... 

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

typedef struct { 
    char action[10]; unsigned long duration; 
} Result; 


Result split(char *input, char delim) 
{ 
Result result = {'\0', 0};     // initialize result by zeros 
char *p = (char*)memchr(input, delim, sizeof(result.action)-1); 
if(p != NULL) {        // if delimiter found in input 
    memcpy(result.action, input, p-input); // copy text till delimiter 
    result.duration = strtoul(p+1, NULL, 10); // convert number after delimiter 
} 
return result;        // return values 
} 

int main(char argc, const char*argv[]) 
{ 
char input[20] = "left#1000!"; 

Result result = split(input, '#'); 
printf("action: %s, duration %u\n", result.action, result.duration); 

return 0; 
} 

... 

안부

RBO

+0

자세한 설명 주셔서 감사합니다! – ask

관련 문제