2012-10-21 5 views
2

에 문자열 CONST 숯 * 복사?는 [C++하지] C에서 C

내가 가진 :

const char *d="/home/aemara/move/folder" 
char tar[80] ; 
int dl=strlen(d); 
int x=0; 
while (x<dl){tar[x]=d[x]; x++; } 
printf("tar[80]: %s\n",tar); 

인쇄를 : tar[80]: /home/aemara/move/folderøèB 문제를이 방법으로, 배열 [때때로, 항상하지] 내가 그것을 어떻게 해결할 수 의 끝에서 쓰레기를 추가하는 것입니다? 또는 const char*을 문자열로 복사하는 다른 방법이 있습니까?

+1

왜) (strcpy를하지? –

+0

@GregHewgill 그는 아마도 두 개의 문자열을 복사하는 법을 배우기를 원할 것입니다. 아마도 숙제 –

+0

@PrototypeStark : 나는 학습을위한 운동의 아이디어를 확실히 이해하고 있지만, 그렇다면 왜 strlen()이 허용 될까요? 또한 명시 적으로 지정하지 않는 한 무작위 제한을 가정하지 않습니다. –

답변

0

이것은 당신이해야 할 일이다

const char *d="/home/aemara/move/folder";//Semi-colon was missing in your posted code 
char tar[80]; 
memset(tar,0x00,80);//This always a best practice to memset any array before use 
int dl=strlen(d);//This returns length of the string in excluding the '\0' in the string 
int x=0; 
if(dl<79)// Check for possible overflow, 79th byte reserved=1 byte for '\0' 
while (x<dl){ tar[x]=d[x]; x++; } 
if(x<80) d[x]=0;//If not using memset have to use this, xth byte initialized to '\0' 
printf("\ntar[80]: %s\n",tar); 
+0

"항상 사용하기 전에 배열을 memset하는 것이 가장 좋습니다." 아니, 그렇지 않아. 이는 방어 프로그래밍이며 단순히 다른 논리 오류를 가릴 수 있습니다. 첫 번째 단계로 배열 지우기가 적절한 경우도 있지만 대부분의 경우에는 필요하지 않습니다. – Clyde

+0

OP의 질문과 맥락에 대해 의견이 나왔습니다. 그리고 저는 여러분의 의견에도 동의합니다. – askmish

2

복사 후 '\ 0'문자를 추가하는 것을 잊었습니다.

이 문제를 해결하려면

, memset(tar,'\0',80);

또는 :

if(d1 < 80){ //bad idea, don't use magic numbers 
    while(x < d1){ tar[x] = d[x]; x++;} 
    tar[x] = '\0'; 
} 
printf.. 
3

strlen는 null 종결하지 않고 길이를 반환합니다. 하나 이상의 바이트를 복사해야합니다.

1

strlen의 반환 값에는 NULL 종결자가 포함되지 않습니다.

while 루프

tar[dl] = '\0'; 

후 다음 줄을 추가하거나 당신은 배열을 선언 할 때 tar를 초기화 제로 수 있습니다.

char tar[80] = {0}; 

이제 루프 이후에 NULL을 종료 할 필요가 없습니다.