2012-02-08 1 views
0

에 char 배열을 할당했습니다. 할당 된 char 배열을 "normal"char 배열에 복사하는 올바른 방법은 무엇입니까? 나는 다음을 수행하려고 시도했지만, 실패 : 당신은 아마 원하는 것은"normal"문자 배열

char * buf = (char *) malloc (BUFSIZ * sizeof(char)); 
// filling up the allocated array with stuff... 
char temp[BUFSIZ]; 
strcpy(temp, buf); // strcpy doesn't work 
+1

무엇을하려합니까? 또한 C 표준에 따르면 char은 1 바이트와 같으므로'* sizeof (char) '는 필요하지 않습니다. –

+3

버퍼를 분석하고 0 터미네이터를 검색 할 필요가 없으므로'memcpy'를 사용하십시오. – valdo

+0

strcpy가 작동하지 않는다고 생각하는 것에 대한 자세한 정보를 제공해야합니다 (예 : 예상 한 것을 보여주지 않은 printf 등) – dasblinkenlight

답변

1

먼저 오류를 숨길 수 있으므로 반환 값 malloc (C에서 어쨌든)을 캐스팅하지 마십시오.

두 번째로 sizeof(char)으로 늘릴 필요가 있습니다. 항상 1을 보장하므로 코드가 막히게됩니다.

그리고, 실제 질문에, 당신은 사용할 수 있습니다

memcpy (temp, buff, BUFFSZ); 

전체 문자 배열을 복사합니다.

문자 배열 만 처리하는 것에 대한 언급이 없기 때문에 원하는 것으로 가정합니다.

실제로 경우 처리 C 문자열 strcpy 제공이 경우 잘 작동한다 있습니다

  • 는 종료 0 바이트에 대한 버퍼의 끝에서 공간을 가지고;
  • 실제로는 이 (가)에 0 바이트를 입력했습니다.

예를 들어,이 작은 조각은 잘 작동 :

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

int main (void) { 
    // Two buffers. 

    char buff1[4]; 
    char *buff2 = malloc (4); 
    if (buff2 == NULL) { 
     puts ("No memory!"); 
     return 1; 
    } 

    // Populate first buffer. 

    buff2[0] = 'p'; 
    buff2[1] = 'a'; 
    buff2[2] = 'x'; 
    buff2[3] = '\0'; 

    // Transfer and print. 

    strcpy (buff1, buff2); 
    puts (buff1); 

    // Free and exit. 

    free (buff2); 
    return 0; 
} 
+0

C++에서는'malloc'의 리턴 값을 캐스팅하는 것이 필요합니다. –

+0

C++ 태그에도 불구하고 이것은 거의 확실한 C 질문입니다. C++에서 malloc 또는 C 스타일 문자열을 사용할 필요가 거의 없습니다. – paxdiablo

1

strncpy() 인 문자열의 바이트의 특정 숫자까지 복사하는. 그 역시 실패 할 경우

strncpy(temp, buf, BUFSIZ - 1); 
temp[BUFSIZ - 1] = '\0'; // null terminate the string 

, 아마도 당신이 당신의 buf에 종료 NUL 문자가없는 memcpy()

memcpy(tmp, buf, BUFSIZ - 1); 
temp[BUFSIZ - 1] = '\0'; // null terminate the string 
0

를 사용합니다. buf[last_actually_used_char+1] = '\0';을해야합니다. 즉, buf은 저장하려는 데이터보다 1 자 이상 커야합니다.

strcpy은 종료 번호 NUL을 검색하여 복사 할 정보의 길이를 찾기 때문에 필요합니다. 방금 데이터 (NO '\0' 필요)을 빠르고 memcpy 안전을 복사 할 경우

나는 강하게 strncpy 안전한 사용을 권장하거나.

1

strcpy은 임의의 메모리 덩어리가 아닌 제로 종료 문자열을 사용합니다.

종료 된 문자열로 채운 경우 strcpy이 작동해야합니다. 그렇지 않은 경우 "작동하지 않음"에 대한 자세한 정보를 제공해주십시오. 당신이 종료 문자열을 원하지 않는 경우

, 다음 memcpy를 사용

그 정의에 의해 1이기 때문에 sizeof(char) 곱 할 필요가 없습니다 것을
memcpy(temp, buf, BUFSIZ); 

참고.

실제로 C++을 작성하는 경우 원시 메모리를 사용하지 않고 std::vector 또는 std::string을 사용하려고합니다.

1

strcpy가 문자열을 복사하는 기능입니다.

문자열은 null 문자로 끝나는 문자 시퀀스입니다.

char *buf = malloc(BUFSIZ); 

malloc 호출 char 배열 BUFSIZ를 할당하지만 문자열 아니다. 배열은 방어 적이기 기능을 사용하여 복사하려면 : 배열 문자열 (널 문자로 종료 일련의 문자), 당신은 다음을 복사 strcpy을 사용할 수를 보유하고

memcpy(temp, buf, BUFSIZ); 

합니다.