안녕하세요. 궁금증연구소입니다.
오늘 포스팅 주제는 "[c언어] strcat 사용 시 주의할 점"입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main(){
char *arr[] = {"pascal","delphi","basic","python"};
int h;
char *pa;
h=0;
for(int i=0; i<4; i++)
h += (strlen(arr[i])+1);
pa = new char[h];
for(int i=0; i<4; i++){
strcat(pa, arr[i]);
if (i<3)
strcat(pa, ",");
}
puts(pa);
delete[] pa;
}
위 코드는 틀렸다. 왜 틀렸을까?
동적 할당된 포인터 pa 내에는 쓰레기 값이 들어 있다. 즉 초기화되지 않았다. 이 상태에서 strcat을 활용해 pa에 arr의 문자열을 차례대로 이어 붙이려고 한다. 이때 생각해야 할 것은 strcat 함수가 작동할 수 있는 것은 문자열 끝에 존재하는 NULL(0) 값 때문이라는 점이다. 그런데 pa는 초기화되지 않았기 때문에 pa 내에는 strcat에 활용할 0이 존재하지 않는다는 점이다. 우연히 0이 있을 수도 있지만, 오히려 엉뚱한 값에 strcat을 할 위험요소가 있다.
따라서 동적 할당을 한 이후, strcat 등을 활용해 해당 메모리 공간에 문자열을 넣으려고 할 경우, 먼저 초기화를 해주는 것을 까먹으면 안 된다.
따라서 위와 같인 p [0]=0 식으로 메모리 값에 0 값을 초기화해 준후, strcat을 사용해야 한다. strcat 함수의 경우 끝에 자동으로 0을 붙이므로 *pa=0 은 해줄 필요가 없다. 단, strcat이 아니라 동적 할당된 공간에 일일이 값을 넣어줄 경우에는 반드시, 마지막에 0을 넣어주어야 한다.
[C언어] 문자열포인터와 문자열의 차이점 (0) | 2022.07.27 |
---|---|
[리눅스] 500 Illegal port command Error 발생시 대처법(ftp) (0) | 2022.07.23 |
[c언어] strcpy 와 포인터 활용시 주의할 (0) | 2022.07.18 |
[c언어] 동적할당 활용시 주의할점 (포인터보단 인덱스) (0) | 2022.07.18 |
[c언어] 포인터와 배열을 같이 쓸때 주의 (0) | 2022.07.18 |