2010-11-28 4 views
3

이 나는 ​​입력의 다음을보다 간단하게 /보다 효율적으로 만들 수 있습니까?

내가 변환하는 방법을 결정 디스패처 기능이 C.

로 아직 내가 실제적인 경험이 없기 때문에 저와 C.에 동적 타입 언어에서 곰을 몇 가지 코드를주십시오 변환하려고 해요 플래그 인수의 값을 에 기초합니다.
void output_dispatcher(char *str, int strlen, int flag) { 
    char output[501]; 
    char *result; 

    switch (flag) { 
     /* No conversion */ 
     case 0: 
      result = str; 
      break; 
     case 1: 
      result = convert_type1(output, str, strlen); 
      len = strlen(result); 
      break; 
     /* ... */ 
    } 
    /* do something with result */ 
} 

나는 현재 5 개 가지 출력 컨버터가 만 300 ~ 500 자 생산에 모두 (심지어 미래 들)이 보장됩니다. 필자의 글에서 은 가능한 경우 스택에 동적으로 공간을 할당하는 것보다 힙 변수를 사용하는 것이 더 바람직합니다. 내가 디스패처에서 나 strlen을 피하려고

static char * convert_type1(char *out, const char *in, int inlen); 

가 출력을 구성 때 출력 컨버터가 그것을 알고 있기 때문에 출력 크기를 계산하는 것이 uncessary 때문에, : 같은 하나의 함수 선언 보인다. 또한, 내가 출력 변수에 대한 포인터를 전달하기 때문에 결과 포인터를 반환 할 필요가 없습니다. 그래서 나는 다음과 같이 을 수정하지만 '호환되지 않는 타입'컴파일 오류가 발생합니다.

void output_dispatcher(char *str, int strlen, int flag) { 
    char output[501]; 

    switch (flag) { 
     /* No conversion */ 
     case 0: 
      output = str; /* ERROR: incompatible type */ 
      break; 
     case 1: 
      strlen = convert_type1(output, str, strlen); 
      break; 
     /* ... */ 
    } 
    /* do something with result */ 
} 

이 접근 방식이 효과가 있습니까? 아니면 더 좋은 방법이 있습니까?

답변

1

하여 출력 컨버터는이 같은 프로토 타입을 가질 필요가 재 계산을 방지하기 위해 : 따라서라고

static char * convert_type1(char *out, const char *in, int *len); 

:

result = convert_type1(output, str, &strlen); 

가 내부적으로 출력 변환기가 의 내용을 읽을 필요를 포인터는 이제 문자열 길이를 포함하고 반환하기 전에 해당 포인터의 내용을 덮어 씁니다.

힙 대 스택의 문제에서 실제로 스택에 할당 된 변수는 함수가 끝나는 즉시 사라지기 때문에 힙을 사용해야합니다.

0

라인 : 배열과 포인터가 유사하지만, 그들은 같은 아니에요 때문에

output = str; 

당신에게 문제를주고있다.

"output"은 포인터가 아니라 배열입니다.

str = output; 

char ptr은 배열 변수와 비슷하기 때문에 작동합니다.

그러나 "출력"변수는 배열에 대한 포인터가 아니고 배열 자체이기 때문에 반대가 아닙니다.

예를 들어

, 당신이 있다면 :

char output[501]; 
char output1[501]; 

와 당신이 한 :

output1 = output; 

이 확인 될 것이고, C는 출력 1 배열에서 출력 배열의 내용을 복사합니다.

그래서 배열과 ptrs에 대해 약간 혼란스러워합니다.

+0

두 번째 예제 ('output1 = output;')는 작동하지 않습니다. 왜냐하면 C에는 이러한 종류의 직접 지정을 허용하지 않는 배열에 대한 특별한 경우 규칙이 있기 때문입니다. 'memcpy (& output1, & output, sizeof output)'은 작동합니다. – caf

0

char 출력 [501]; 출력 = str;/* ERROR : 호환 형 */

=>

를 strncpy (출력, STR,는 sizeof (출력)); '출력' 'STR'

0

이 경우 오류가 의미가 저장하기에 충분히 큰 경우

주, 당신은 확인해야합니다. output은 char 데이터를 저장하는 버퍼이고 str은 메모리의 다른 영역에 대한 포인터입니다. str이 출력을 가리키는 주소를 할당하지 않으려 고합니다. 이 접근 방식으로 가고 싶다면 str이 가리키는 데이터를 출력으로 복사하는 것이 좋을 것입니다. 더 좋은 변환이 필요하지 않으면 str을 사용하십시오.

0

C는 직접 할당으로 배열을 수정할 수 없으므로 배열 구성원을 개별적으로 수정해야합니다. 당신이 문자열 배열 outputstr가 가리키는 복사하려는 경우 따라서, 당신은 사용해야합니다

strcpy(output, str); 

혹은

memcpy(output, str, strlen + 1); 

(두 경우를 먼저 strlen < sizeof output 것을 확인한 후).

로컬 변수 strlen의 이름을 지정하면 해당 이름의 표준 기능이 섀도 잉되므로 나중에 코드를 보는 사람이 약간 혼란 스러울 것입니다. 나는 다른 이름을 고를거야.

관련 문제