2011-11-11 4 views
3

=================================================================== ==============================트리밍 기능이 제대로 작동하지 않는 이유를 알 수 없음

void trim(const char * orig, char * dest) 
{ 
    size_t front = 0; 
    size_t end = sizeof(orig) - 1; 
    size_t counter = 0; 
    char * tmp = null; 

    if (sizeof(orig) > 0) 
    { 
     memset(dest, '\0', sizeof(dest)); 

     /* Find the first non-space character */ 
     while (isspace(orig[front])) 
     { 
       front++; 
     } 
     /* Find the last non-space character */ 
     while (isspace(orig[end])) 
     { 
       end--; 
     } 

     tmp = strndup(orig + front, end - front + 1); 
     strncpy(dest, tmp, sizeof(dest) - 1); 
     free(tmp); //strndup automatically malloc space 
    } 
} 

===========================================

'      : ================================

나는 문자열을 가지고  ABCDEF/G01    ABCDEF/G01 ' :'

을 위의 기능이 공백을 제거하고 나에게 반환하도록되어

'819,         .

대신에, 나는 다시 무엇을 얻을 :

'ABCDEF /'

어떤 아이디어?

참고 : 따옴표는 공백이 원래 문자열에 있음을 나타냅니다.

답변

4

strncpy이 잘못되었습니다. sizeof(dest)은 원하는 것이 아닙니다 (컴퓨터의 포인터 크기입니다). 당신은 아마 원할 것입니다 : end - front. 대신, 시도 :

memcpy(dest, front + start, end - front); 
dest[end] = 0; 
+1

감사합니다! 나는 이것을 극복하고 있었다.나는 이것을 "end - front + 1"로 바꾸었다. 물론, 나는 끝 - 정면 + 1이 내가 목적지 인 최대 길이보다 작음을 확인하고있다. – Sagar

1
size_t end = sizeof(orig) - 1; 
strncpy(dest, tmp, sizeof(dest) - 1); 

당신은 아마 대신 여기를 sizeof의 나 strlen합니다.

1
void trim(const char * orig, char * dest) 
{ 
    size_t front = 0; 
    size_t end = sizeof(orig) - 1; 

해당 코드에서 sizeof(orig)은 포인터의 크기입니다. 모든 포인터는 동일한 크기이며 구현시 8 개입니다. 당신이 사용하고자하는 것은 대신 strlen(orig)입니다.

+0

OP에 64 비트 OS가 있다고 짐작한다. :) – StuartLC

2

sizeof(dest) 당신이 생각하는대로하지 않습니다! 문자열의 길이가 아닌 포인터의 크기를 반환합니다. 당신은 당신의 기능에 목적지의 최대 길이를 제공해야합니다.

orig 문자열의 경우 strlen 기능을 사용하려고합니다.

0

은 (는 임시 메모리를 사용하지 않습니다)이 코드를보십시오 :

void trim(const char * orig, char * dest) 
{ 
    size_t front = 0; 
    size_t end = strlen(orig)-1; 
    size_t counter = 0; 

    *dest = '\0'; 

    if (strlen(orig) > 0) 
    {  
     /* Find the first non-space character */ 
     while (front < end && isspace(orig[front])) 
     { 
       front++; 
     } 
     /* Find the last non-space character */ 
     while (front < end && isspace(orig[end])) 
     { 
       end--; 
     } 

     counter = front; 
     while (counter <= end) 
     { 
       dest[counter-front] = orig[counter]; 
       counter++; 
     } 
    } 
} 

참고 : 테스트하지!

0

함수의 모든 곳에서 sizeof()를 strlen()으로 바꾸어야합니다. 여기에 노력하고 있습니다 편집 :

void trim(const char * orig, char * dest) 
{ 
    size_t front = 0; 
    size_t end = strlen(orig)-1; 
    size_t counter = 0; 
    char * tmp = NULL; 

    if (strlen(orig) > 0) 
    { 
     memset(dest, '\0', strlen(dest)); 

     /* Find the first non-space character */ 
     while (isspace(orig[front])) 
     { 
      front++; 
     } 
     /* Find the last non-space character */ 
     while (isspace(orig[end])) 
     { 
      end--; 
     } 

     tmp = strndup(orig + front, end - front + 1); 
     strncpy(dest, tmp, strlen(dest)); 
     free(tmp); //strndup automatically malloc space 
    } 
} 

(내가 그것을 테스트 한)

+0

-1은 목적지를 ' \ 0 '널 문자. – Sagar

+0

디버거에서 sizeof()가 'ABCDEF/G01'문자열의 경우 10 insted 10을 반환합니다. %) – ASten

관련 문제